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

看来我经常返回“失败”。以下是我在“返回失败”处的断点被击中时各种变量的值:

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%6f%63%6b%2e%64%6c%6c"

hst:“bgfx.net”

主机:空

错误: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%6f%63%6b%2e%64%6c%6c"

在此之前已调用 WSAStartup。

4

3 回答 3

7

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

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

尝试在将字符串传递给 WS 之前将其复制到堆中:

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

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

于 2009-05-14T14:16:35.097 回答
2

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

X86 和 X64 芯片通常可以容忍不对齐的结构,但性能损失很小,但诸如 TransmitPackets 之类的操作系统调用通常不能。

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

于 2009-12-05T00:39:40.217 回答
1

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

于 2009-05-14T07:00:06.050 回答