为什么bind()和accept()允许你指定结构的大小?

时间:2012-03-13 21:35:01

标签: sockets networking network-programming

bind()和accept()允许您在第二个参数中指定结构的大小。但我只看到整个结构的大小被传递。为什么他们让你指定大小?是否有任何使用不同号码的情况?

5 个答案:

答案 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