今天遇到个问题,我的系统win7系统下使用getpeername接口获取IP可以,但是我同事的win10却不行,接口调用返回失败,获取的错误码为10014.
网络上找到一个相关的文章:
https://blog.csdn.net/readyisme/article/details/28249883
查看MSDN对应的描述(https://msdn.microsoft.com/en-us/library/ms738533(v=vs.85).aspx):
WSAEFAULT(10014):The name or the namelen parameter is not in a valid part of the user address space, or the namelen parameter is too small.
大致的意思就是缓冲区给小了。调整成如上篇文章的代码后,接口正常可以使用。不过使用另外一个接口也能实现同样的效果而且不会出现getpeername问题。这个接口就是getsockname。
参考代码如下:
方法1:
struct sockaddr_in address1[2];
memset(&address1, 0, sizeof(address1));
socklen_t nAddrLen1 = sizeof(address1);
if (::getpeername(idSocket, (struct sockaddr *)&address1, &nAddrLen1) != 0)
{
printf("getpeername failed, idSck:%u, error:%u.", idSocket, GetLastError());
return false;
}
方法2:
struct sockaddr_in address2;
memset(&address2, 0, sizeof(address2));
socklen_t nAddrLen2 = sizeof(address2);
if (::getsockname(idSocket, (struct sockaddr *)&address2, &nAddrLen2) != 0)
{
printf("getsockname failed, idSck:%u, error:%u.", idSocket, GetLastError());
return false;
}