2016-06-23 3 views
-1

У меня этот код, сделанный в C++ для подключения к серверу, но каждый раз, когда я пытаюсь «gethostbyname», значение равно null (или оптимизировано и недоступно).Проблемы с gethostbyname C++

WSADATA wsaData; 
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { 
    cout << "WSAStartup failed.\n"; 
    system("pause"); 
    return 1; 
} 
hostent *host = gethostbyname("www.example.com"); 

Я пробовал хостент как изменчивый, но по-прежнему не имеет значения. Есть ли другой способ сделать эту работу? Я пробовал слишком оптимизировать, но не дал нулю.

+1

«Возвращаемое значение Если ошибка не возникает, gethostbyname возвращает указатель на структуру хоста, описанную выше. В противном случае он возвращает нулевой указатель, а конкретный номер ошибки можно получить, вызвав WSAGetLastError». (MSDN) – lorro

+1

Какова предполагаемая связь между открытым сокетом и хост-запросом? –

ответ

4

host - null по ошибке. Проверьте возвращаемое значение WSAGetLastError(), чтобы выяснить, что случилось.

Попробуйте позвонить ping www.example.com в командной строке cmd, чтобы проверить, доступна ли цель с вашего компьютера.

Чтобы не оптимизировать надстройку:

if(host!=NULL && host->h_name) 
    cout << "host: " << host->h_name << std::endl; 

Не храните указатели, возвращаемые gethostbyname(). Они переопределяются при следующем вызове той же нитью.

+0

'gethostbyname()' fail, если он не может разрешить имя хоста IP-адресу, например, через DNS. 'ping' - это не то же самое, что' gethosbyname() '. 'ping' фактически проверяет, достижимо ли цель в сети, поэтому даже если' gethosbyname() 'преуспевает,' ping' все равно может выйти из строя, если нет сетевого маршрута к цели. –

+0

@ Remy Lebeau Я не утверждал, что это то же самое, но если ping терпит неудачу, gethostbyname, скорее всего, тоже потерпит неудачу. – lexx9999

+0

, что зависит от того, как «ping» терпит неудачу. 'ping' может разрешить имя хоста в IP, но все же не сможет общаться с главной машиной. –

Смежные вопросы