Winsock error code 10014

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”

host:NULL

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

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;

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


1
Windows 10仍存在一个错误。即使缓冲区只是堆栈上的普通char buf [256],也可能会触发该错误。对于Google:10014 = WSAEFAULT。 - MSalters
@MSalters,我现在也遇到了同样的问题。我们该如何解决? - Y K
@YK:您正在接受的答案下进行评论。如果此答案对您无效,请创建一个最小示例,展示它在哪里出现了问题。然后,您可以将其发布为新问题,但请链接回此问题以提供上下文。 - MSalters

2
错误代码10014也会返回给未正确对齐地址的情况,即使该地址是有效的。这意味着在32位系统上,地址必须是4的倍数,在64位系统上,它们必须是8的倍数。
X86和X64芯片通常可以容忍不对齐的结构,但操作系统调用(如TransmitPackets)通常不行。
我在调试一个看起来相当随机的TransmitPackets问题时发现了这一点。我的问题是我编写的堆分配器没有始终在正确的边界上对齐分配。修复堆分配器消除了这些问题。

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接