struct sockaddr,我们真的需要给addrlen吗?

时间:2017-01-24 11:44:29

标签: c networking struct

我目前正在编写一个使用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)); 

非常感谢

1 个答案:

答案 0 :(得分:0)

它链接到不同操作系统之间的套接字API历史记录。每个系统都有自己的套接字实现,这些API在它们之间没有标准化。

  

socklen_t是一个奇怪的typedef,用于结构sockaddr的大小   accept(),getpeername()和connect()。

     

这种typedef的原因是在BSD中,这些函数占用了一个   int *,当他们决定制作时,POSIX的人把它搞砸了   这样的参数指向(可能)另一个大小的整数,   在新的typedef下。