我在 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/