我目前正在编写一个使用网络结构(例如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/

10-10 13:52