Winsock错误代码10014

string SendRequestToServer(std::string url) { struct sockaddr_in addr = { 0 }; struct hostent *host = NULL; // If the URL begins with http://, remove it. if(url.find("http://") == 0) url.erase(0, 7); // Get the host name. string hst = url.substr(0, url.find('/', 0)); url.erase(0, url.find("/", 0)); // Connect to the host. host = gethostbyname(hst.c_str()); if(!host) { Print("%s", "Could not resolve the hostname."); int error = WSAGetLastError(); return "failed"; } } 

看来我很频繁地返回“失败”。 这里是我的断点在“返回失败”命中时各种variables的值:

url:“/wowus/logger.cgi?data=%43%3a%5c%57%49%4e%44%4f%57%53%5c%53%79%73%74%65%6d%33%32 %5C%6D%73%77%73%1207%63%图6b%2E%64%图6c%6C”

hst:“bgfx.net”

主机:NULL

错误:10014

这里发生了什么? 更重要的是,我该如何解决?

注意:SendRequestToServer的原始参数是“bgfx.net/wowus/logger.cgi?data=%43%3a%5c%57%49%4e%44%4f%57%53%5c%53%79%73% 74%65%图6d%33%32%图5c%6D%73%77%73%1207%63%图6b%2E%64%图6c%6C”

WSAStartup在此之前已被调用。

Solutions Collecting From Web of "Winsock错误代码10014"

有些人报告说,如果在应用程序堆栈内存中有指针,WS可能会因此错误而失败。

它看起来像你使用VS2005或更新,其中std :: string有内部16个字符长缓冲区 – 正是这个缓冲区地址被传递到gethostbyname()。

尝试将您的字符串复制到堆之前传递给WS:

 char *hstSZ = new char[hst.size() + 1]; strcpy(hstSZ, hst.c_str(); host = gethostbyname(hstSZ); delete[] hstSZ; 

让我们知道,如果它帮助:)

即使地址有效,也会返回10014错误地址。 这意味着在32位系统上,地址必须是4的倍数,而在64位系统上,它们必须是8的倍数。

X86和X64芯片通常容忍错位结构,性能损失较小,但是诸如TransmitPackets之类的操作系统调用通常不会。

我在调试TransmitPackets问题的时候发现了这个问题,看起来很随意。 我的问题是我写的堆分配器并不总是将分配对齐在适当的边界上。 修复堆分配器消除了问题。

10014是WSAEFAULT。 您将从文档中注意到这意味着“名称参数不是用户地址空间的有效部分”。 我会检查什么hst.c_str()返回。