今天遇到個問題,我的系統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;
}