bind()和accept()允许您在第二个参数中指定结构的大小。但我只看到整个结构的大小被传递。为什么他们让你指定大小?是否有任何使用不同号码的情况?
答案 0 :(得分:3)
不同的套接字协议系列使用不同类型的结构。例如,使用IPv4地址的TCP和UDP套接字使用sockaddr_in
结构,其大小为16字节,而IPv6地址使用sockaddr_in6
结构,而不是28字节。
答案 1 :(得分:1)
sockaddr
结构的大小可能会有所不同,例如,取决于您使用的是IPv4还是IPv6。
答案 2 :(得分:1)
指定大小是因为这些是系统调用,它们以内核模式和内核的地址空间执行,而内核不知道在内核地址空间和用户地址空间之间要复制多少数据。例如,它无法看到您使用的是IPv4还是IPv6地址结构。
答案 3 :(得分:0)
大小可能取决于实现,套接字和/或平台的类型。因此,如果您通过调用传递此大小,则无论使用哪些额外字段或填充,相同的代码都可以在不同平台上运行。
答案 4 :(得分:0)
这是由于历史原因:穷人的函数重载以接受不同类型的套接字地址,如IPv4,UNIX,IPv6。有关详细信息,请参阅page 68 of UNIX Network Programming: The sockets networking API。