为什么getpeername中的namelen-parameter使用Winsock中的指针?

时间:2013-05-10 17:24:54

标签: c++ sockets winsock

这是一个只是感兴趣的问题:为什么getpeername - Winsock中的namelen收到sockaddr_in addr; int addrLength = sizeof(sockaddr_in); if (getpeername(s, reinterpret_cast<sockaddr*>(&addr), &addrLength /* <- this */) != SOCKET_ERROR) { // ... } - 参数作为指针?在我看来,这是一个重大的设计缺陷。

示例:

{{1}}

3 个答案:

答案 0 :(得分:1)

由于

  

返回时,namelen参数包含返回的name参数的实际大小(以字节为单位)。

即。如链接所示,namelen_Inout_参数,这意味着您将信息传递给函数,并且可以期望它返回该参数中的信息。

答案 1 :(得分:1)

因为,正如您链接的文档所描述的那样,它用于输入和输出。在输入时,它是您提供的缓冲区的大小;在输出上它是结构的实际大小。

  

在我看来,这是一个重大的设计缺陷。

如果您事先知道套接字类型(以及因此地址信息大小),这会给您带来轻微的不便,如果您不知道,则会很有用。

答案 2 :(得分:0)

设计缺陷。相反,没有长度参数将是一个设计缺陷。

在编译调用程序时,将某个子例程库的客户端传递给结构的大小定义为是一种常见的模式。

这样,当安装了具有不同sockaddr结构定义的新版本的库(在本例中为ws2_32.dll)时,它可以与旧程序兼容,而不仅仅是崩溃。

如果没有这个参数,每个使用Winsock库的应用程序都必须静态链接它自己的Winsock库的私有副本。一旦这样的程序被链接和分发,它将永远不会获得任何库更新的好处。