0

这是一个有趣的问题:为什么getpeername-函数out ofWinsock接收-namelen参数作为指针?在我看来,这是一个主要的设计缺陷。

例子:

sockaddr_in addr;
int addrLength = sizeof(sockaddr_in);

if (getpeername(s, reinterpret_cast<sockaddr*>(&addr), &addrLength /* <- this */) != SOCKET_ERROR)
{
    // ...
}
4

3 回答 3

1

因为

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

即,正如链接所说,namelen是一个_Inout_参数,这意味着您将信息传递给函数,并且可以期望它在该参数中返回信息。

于 2013-05-10T17:27:59.227 回答
1

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

在我看来,这是一个主要的设计缺陷。

如果您提前知道套接字类型(以及因此地址信息大小),这会带来一些不便,如果您不知道它会很有用。

于 2013-05-10T17:28:13.290 回答
0

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

让某些子例程库的客户端传入编译调用程序时定义的结构大小是一种常见模式。

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

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

于 2014-03-03T00:29:03.547 回答