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

Jos*_*ras 6 c c++ sockets networking

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

int accept (int socket, struct sockaddr *address, socklen_t *address_len);
Run Code Online (Sandbox Code Playgroud)

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

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

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

非常感谢!

R..*_*R.. 5

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

另请注意,可以在不知道涉及什么类型的地址/协议系列的情况下使用此类接口。例如,您的库代码中可能有一个函数,该函数接受未知类型的套接字并使用结构调用它的accept sockaddr_storage。它可能会找到 IPv4 地址、IPv6 地址或完全其他的地址,具体取决于调用者的操作。

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