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