Код ошибки Winsock 10014 - PullRequest
5 голосов
/ 14 мая 2009
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 fail» достигнута:

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% 6б% 2e% 64% 6c% 6с "

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

WSAStartup был вызван до этого.

Ответы [ 3 ]

6 голосов
/ 14 мая 2009

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

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

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

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

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

2 голосов
/ 05 декабря 2009

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

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

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

1 голос
/ 14 мая 2009

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

...