接受函数的地址大小长度,以 <sys/socket.h 为单位>



在"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运行并希望知道远程地址的守护进程都必须这样操作。

相关内容

最新更新