<sys socket.h =“”> </sys>中accept函数的地址大小长度

时间:2012-03-22 14:52:36

标签: c++ c sockets networking

在“sys / socket.h”中定义了函数:

int accept (int socket, struct sockaddr *address, socklen_t *address_len);

我的问题与 socklen_t * address_len 有关,它基于manual指向 socklen_t ,其中输入指定所提供的 sockaddr 结构,并在输出中指定存储地址的长度。

address_len 大小输入在什么条件下会与输出不同?

我需要这个,所以我可以在我为 sockaddr_in 结构创建的包装器上模拟一个测试用例。

非常感谢!

1 个答案:

答案 0 :(得分:4)

它永远不会更多(输入长度​​是防止溢出的界限),但对于某些套接字类型可能更少,例如其地址本质上是路径名的unix域套接字。对于IP(v4或v6)套接字,它始终是相应sockaddr_insockaddr_in6结构的标称大小。

另请注意,可以使用某些类似的接口,而无需了解所涉及的地址/协议系列类型。例如,您可能有一个函数作为库代码的一部分,它接受一个未知类型的套接字,并使用sockaddr_storage结构调用accept。它可能会找到IPv4地址,IPv6地址或其他完全不同的内容,具体取决于调用者的行为。

accept这种用法相当不典型,但getpeername使用相同界面风格的可能性更大。实际上,这是从inetd运行并且想知道远程地址的所有守护进程必须运行的方式。