Winsock错误代码10014

时间:2009-05-14 01:20:32

标签: c++ windows winsock wsastartup

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";
}
}

似乎我经常回来“失败”。当命中“return failed”的断点时,以下是各种变量的值:

url:“/ wowus / logger.cgi?data =%43%3 %% 5c%57%49%4 %% 44%4 %%%%%%%%%%%%%%%%%%%%%%%%% 33%32%图5c%6D%73%77%73%1207%63%图6b%2E%64%图6c%6C“

hst:“bgfx.net”

host: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。

3 个答案:

答案 0 :(得分:6)

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

看起来你正在使用VS2005或更新版本,其中std :: string有内部16个字符长缓冲区 - 而且这个缓冲区地址正好被传递到gethostbyname()。

尝试将字符串复制到堆中,然后再将其传递给WS:

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

如果有帮助,请告诉我们。)

答案 1 :(得分:2)

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

X86和X64芯片通常可以容忍未对齐的结构,性能损失很小,但是像TransmitPackets这样的操作系统调用通常不会。

我在调试似乎非常随机的TransmitPackets问题时发现了这一点。我的问题是我写的堆分配器并不总是在正确的边界上对齐分配。修复堆分配器可以消除问题。

答案 2 :(得分:1)

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