1

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

getsockname(*x,NULL,0)

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

提前致谢

4

1 回答 1

3

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

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

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

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

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

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

int result = getsockname(*x,NULL,0); 
if(result){
    /*Failed - handle here*/ 
} 
于 2012-10-18T10:25:47.373 回答