在"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_in
或sockaddr_in6
结构的标称大小。
还要注意的是,在不知道所涉及的地址/协议族类型的情况下,可以使用类似的一些接口。例如,您可能有一个函数作为库代码的一部分,它接受未知类型的套接字,并使用sockaddr_storage
结构对其调用accept。它可能会找到IPv4地址和IPv6地址,或者完全是其他地址,这取决于调用者的操作。
这种用法对于accept
来说相当不典型,但对于使用相同接口样式的getpeername
来说更可能。事实上,所有从inetd
运行并希望知道远程地址的守护进程都必须这样操作。