我目前正在编写一个使用sockaddr
等网络结构的C库。
在我的代码中,我使用这个三元条件来推断出这种结构的大小。
addrlen = sourceaddr->sa_family ==
AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6);
但是,大多数标准的unix函数(例如bind
)都有这种签名:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
它包含地址长度addrlen
的明确声明。
我的问题是:“如果我可以使用sa_family
推断出地址len,为什么我需要明确指示地址len?”
例如,绑定调用可以更改为此签名:
int bind(int sockfd, const struct sockaddr *addr);
并在内部使用:
__bind(sockfd, addr,
addr->sa_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6));
非常感谢
答案 0 :(得分:0)
它链接到不同操作系统之间的套接字API历史记录。每个系统都有自己的套接字实现,这些API在它们之间没有标准化。
socklen_t是一个奇怪的typedef,用于结构sockaddr的大小 accept(),getpeername()和connect()。
这种typedef的原因是在BSD中,这些函数占用了一个 int *,当他们决定制作时,POSIX的人把它搞砸了 这样的参数指向(可能)另一个大小的整数, 在新的typedef下。