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

getsockname(*x,NULL,0)

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

提前致谢

最佳答案

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

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

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

但是,这不属于Posix规范的一部分,我不读为,但需要函数来检查地址-就可以了。换句话说,至少在Posix中,这是未定义的行为。那意味着什么都可能发生。

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

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

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

09-06 06:08