Код ошибки 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";
}
}

Кажется, я довольно часто возвращаюсь «неудачно». Вот значения различных переменных, когда моя точка останова в «возврате не удалась» сработала:

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 был вызван до этого.


person Clark Gaebel    schedule 14.05.2009    source источник


Ответы (3)


Некоторые люди сообщают, что WS может выйти из строя с этой ошибкой, если есть указатель в памяти стека приложения.

Похоже, вы используете VS2005 или новее, где std::string имеет внутренний буфер длиной 16 символов, и именно этот адрес буфера был передан в gethostbyname().

Попробуйте скопировать строку в кучу, прежде чем передавать ее в WS:

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

И дайте нам знать, если это помогло :)

person Community    schedule 14.05.2009
comment
Все еще ошибка в Windows 10. Может даже срабатывать, когда буфер является простым char buf[256] в стеке. Для Google: 10014 = WSAEFAULT. - person MSalters; 20.02.2017

Ошибка 10014 также будет возвращена для адресов, которые не выровнены должным образом, даже если адрес действителен. Это означает, что в 32-битных системах адреса должны быть кратны 4, а в 64-битных системах они должны быть кратны 8.

Микросхемы X86 и X64 обычно допускают неправильное выравнивание структур с небольшим снижением производительности, но вызовы операционной системы, такие как TransmitPackets, часто этого не делают.

Я обнаружил это во время отладки проблемы TransmitPackets, которая казалась довольно случайной. Моя проблема заключалась в том, что распределитель кучи, который я написал, не всегда выравнивал распределения по правильной границе. Исправление распределителя кучи устранило проблемы.

person Ron Murray    schedule 05.12.2009

10014 — это WSAEFAULT. Из документации вы заметите, что это означает «Параметр имени не является допустимой частью адресного пространства пользователя». Я бы проверил, что возвращает hst.c_str().

person user253751    schedule 14.05.2009