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

7
在“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结构体创建的包装器的测试用例。
非常感谢!

sockaddr 的第二个成员是一个 char 数组。address_len 中返回的值将包含该成员实际使用了多少个元素(而不是它可以容纳多少个元素)。 - Attila
1个回答

4
它永远不会更多(输入长度是为了防止溢出),但对于某些套接字类型,例如地址本质上是路径名的Unix域套接字,它可能会更少。对于IP(v4或v6)套接字,它将始终是相应的sockaddr_insockaddr_in6结构的名义大小。
还要注意,有可能像这样使用一些接口,而不知道涉及哪种类型的地址/协议族。例如,您可能拥有作为库代码一部分的函数,该函数采用未知类型的套接字,并在其上使用sockaddr_storage结构调用accept。它可能会找到IPv4地址、IPv6地址或完全不同的内容,具体取决于调用者的操作。
这种用法对于accept来说相当不典型,但对于使用相同接口风格的getpeername来说则更有可能。实际上,所有从inetd运行并希望知道远程地址的守护程序都必须采用这种方式运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接