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

标签 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?”

例如,绑定(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 is a strange typedef for the size of a struct sockaddr in accept(), getpeername(), and connect().

The reason for this typedef is that in BSD, those functions took an int*, and the POSIX people screwed it all up when they decided to make such arguments point to an integer of (potentially) another size, under a new typedef.

关于c - struct sockaddr,我们真的需要给addrlen吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41827400/

相关文章:

c++ - 使用指向该结构的指针访问结构变量成员的地址

json:无法将字符串解码为 []main.KVU 类型的 Go 值

c - 如何在套接字服务器应用程序中重用端口?

python - 最简单的python网络消息传递

c - Security.h 中结构的 macOS 文档

linux - 如何在 sysfs 中写入每个 channel 的属性

C++ 无法接收 UDP 数据包(套接字)

c - 在我的 C 程序中出现 SIGSEGV 错误

c - malloc+strdup 会泄漏内存吗?

c++ - 没有外部内核文件的openCL