【问题标题】:Problems with gethostbyname c++gethostbyname c++ 的问题
【发布时间】:2016-06-23 21:17:34
【问题描述】:

我用 C++ 编写了这段代码来连接服务器,但每次我尝试“gethostbyname”时,该值都是空的(或已优化且不可用)。

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

我已经尝试将 hostent 作为 volatile 但仍然给出 null。 有没有其他方法可以使这项工作? 我也试过优化禁用但一直给null。

【问题讨论】:

  • "返回值如果没有发生错误,gethostbyname返回一个指向上述hostent结构的指针。否则,它返回一个空指针,并且可以通过调用WSAGetLastError来检索特定的错误号。" (MSDN)
  • 打开的套接字和主机查询之间的假定关系是什么?

标签: c++ windows gethostbyname


【解决方案1】:

host 出错时为空。检查WSAGetLastError()的返回值,找出问题所在。

尝试在 cmd shell 中调用 ping www.example.com 以检查目标是否可以从您的计算机访问。

不优化添加:

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

不要存储gethostbyname() 返回的指针。它们在同一线程的下一次调用中被覆盖。

【讨论】:

  • gethostbyname() 如果无法将主机名解析为 IP 地址(例如通过 DNS),则会失败。 pinggethosbyname() 不同。 ping 实际上会检查目标是否在网络上可达,因此即使gethosbyname() 成功,如果没有到目标的网络路由,ping 仍然会失败。
  • @Remy Lebeau 我并没有声称它是一样的,但是如果 ping 失败,gethostbyname 也可能会失败。
  • 这取决于ping 如何失败。 ping 可能能够将主机名解析为 IP,但仍无法与主机实际通信。
猜你喜欢
  • 1970-01-01
  • 2011-07-05
  • 2011-10-04
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多