我目前正在编写一个使用网络结构(例如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?”例如,bind调用可以更改为此签名:
int bind(int sockfd, const struct sockaddr *addr);
并在内部使用:
__bind(sockfd, addr,
addr->sa_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6));
非常感谢你
最佳答案
它链接到不同操作系统之间的套接字API历史记录。每个系统都有自己的套接字实现,并且其中的API尚未标准化。
socklen_t是一个奇怪的typedef,它的大小为sockaddr
accept(),getpeername()和connect()。
使用这种typedef的原因是,在BSD中,这些功能占用了
int *,而POSIX员工在决定制作时将所有内容搞砸了
这样的参数指向(可能)另一个大小的整数,
在新的typedef下。
关于c - struct sockaddr,我们真的需要给addrlen吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41827400/