2017-01-24 31 views
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)); 

非常感谢您

+0

向后兼容性。如果你改变了'bind'函数的签名,那么你就不再符合POSIX(如果你争取的话)或兼容任何其他'bind'函数。 –

+0

好的。这意味着之前的sockaddr结构没有sa_family字段?那么,你会建议最近的一个图书馆:使用或不使用addrlen?谢谢 :) –

回答

0

它与插座之间API历史不同的操作系统。每个系统都有自己的套接字实现,这些API在它们之间不是标准化的。

socklen_t的为结构sockaddr在 尺寸的奇怪的typedef接受(),getpeername(),并连接()。

这样做的原因typedef的是,在BSD,这些职能采取了 INT *和POSIX人搞砸了这一切时,他们决定把 这种说法指向(潜在的)其他尺寸, 的整在一个新的typedef下。

相关问题