c++ - name = null 时的 getsockname 行为

标签 c++ windows null winsock2

我在 Windows 中有调用 getsockname 的代码如下:

getsockname(*x,NULL,0)

第三个参数(namelen)是IN\Out参数,包含名称缓冲区的大小,以字节为单位。返回时,namelen 参数包含 name 参数的实际大小(以字节为单位)。
现在,我的问题是,如果 name 等于 null,namelen 等于零,会发生什么?我在 linux 中看到,如果 name 为 NULL,namelen 被忽略,但 MSDN 没有提及任何关于这种情况的信息。 . MSDN 链接是 here Linux 的 IBM 链接是 here

提前致谢

最佳答案

在您的代码中,您为第三个参数传递了零。

第三个参数不能为空,根据规范,它必须是一个指向整数的指针,给出第二个参数的长度,并在输出时给出地址的实际大小。传递零 意味着您说没有分配存储空间,这意味着您没有传递信息,也没有在任何地方写入输出值。

根据 MSDN 和 Linux 文档,该函数应返回 -1 并将 errno 设置为 EFAULT(或在 Windows 中将 WSAGetLastError 设置为 WSAEFAULT套接字)。这被定义为“使用指定的 name 和 namelen 参数将导致尝试访问调用者地址空间之外的存储。”

然而,这不是 Posix 规范的一部分,我不认为它是要求检查地址的功能 - 只是它可以。换句话说,至少在 Posix 中,这是未定义的行为。这意味着任何事情都可能发生。

在 Linux 中,您说您观察到如果传递 null,这两个参数将被忽略。我怀疑您的代码没有检查返回值,返回值可能是 -1,errno 设置为 EFAULT

Posix 函数不会抛出异常。您应该检查返回码,可能是这样的:

int result = getsockname(*x,NULL,0); 
if(result){
    /*Failed - handle here*/ 
} 

关于c++ - name = null 时的 getsockname 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12952037/

相关文章:

c - 在将指针传递给函数之前,我必须始终对其进行初始化吗?

Java,解析我知道的 JSON 对象为空

reflection - 在不使用反射的情况下检查 Go 中的接口(interface)值是否为 nil

c++ - Visual C++ 中的 __PRETTY_FUNCTION__

javascript - 可用于 Windows 上 Chrome 的 --js-flags 列表?

windows - 如何在gradle文件夹中创建缓存文件夹?

windows - 如何在从 Windows 服务启动的子外壳中设置 http 代理

c++ - 使用 WinCE7 平台构建器在 Visual Studio 2008 中为 WinCE7 在 Visual C++ 中创建 Winforms

c++ - 非静态数据成员(typedef 映射)的使用无效

c++ - 在函数内部创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?