0
我目前正在编写一个使用网络结构的C库,如sockaddr
。 在我的代码中,我使用这个三元条件来推断这种结构的大小。struct sockaddr,我们是否真的需要给addrlen
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?”
例如,绑定电话可以转到此签名:
int bind(int sockfd, const struct sockaddr *addr);
并在内部使用:
__bind(sockfd, addr,
addr->sa_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6));
非常感谢您
向后兼容性。如果你改变了'bind'函数的签名,那么你就不再符合POSIX(如果你争取的话)或兼容任何其他'bind'函数。 –
好的。这意味着之前的sockaddr结构没有sa_family字段?那么,你会建议最近的一个图书馆:使用或不使用addrlen?谢谢 :) –