中accept函数的地址大小长度

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

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

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

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

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

非常感谢!

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

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

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