【问题标题】:getsockname behaviour when name = null当 name = null 时,getsockname 行为
【发布时间】:2012-10-18 18:59:09
【问题描述】:

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

getsockname(*x,NULL,0)

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

提前致谢

【问题讨论】:

  • Linux manual pagePOSIX manual page 都没有提到这一点。
  • 那么,你知道这段代码会发生什么吗?
  • IBM 网站的链接描述了 z/OS 而非 Linux 上的行为。

标签: c++ windows null winsock2


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 这段代码运行良好,我没有得到任何异常。会不会是在我完全不知情的情况下发生了什么不好的事情?
  • Posix 函数不会抛出异常。您应该检查返回码,如int result = getsockname(*x,NULL,0); if(result){/*Failed - handle here*/ }
  • @rrr,一样。它在您链接到自己的文档中。
猜你喜欢
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2017-08-18
  • 2016-12-11
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
相关资源
最近更新 更多