在“sys / socket.h”中定义了函数:
int accept (int socket, struct sockaddr *address, socklen_t *address_len);
我的问题与 socklen_t * address_len 有关,它基于manual指向 socklen_t ,其中输入指定所提供的 sockaddr 结构,并在输出中指定存储地址的长度。
address_len 大小输入在什么条件下会与输出不同?
我需要这个,所以我可以在我为 sockaddr_in 结构创建的包装器上模拟一个测试用例。
非常感谢!
答案 0 :(得分:4)
它永远不会更多(输入长度是防止溢出的界限),但对于某些套接字类型可能更少,例如其地址本质上是路径名的unix域套接字。对于IP(v4或v6)套接字,它始终是相应sockaddr_in
或sockaddr_in6
结构的标称大小。
另请注意,可以使用某些类似的接口,而无需了解所涉及的地址/协议系列类型。例如,您可能有一个函数作为库代码的一部分,它接受一个未知类型的套接字,并使用sockaddr_storage
结构调用accept。它可能会找到IPv4地址,IPv6地址或其他完全不同的内容,具体取决于调用者的行为。
accept
这种用法相当不典型,但getpeername
使用相同界面风格的可能性更大。实际上,这是从inetd
运行并且想知道远程地址的所有守护进程必须运行的方式。