从机器名称查找机器IP地址

时间:2016-02-26 12:33:24

标签: c++ boost wxwidgets

我知道远程机器名称,这台机器在同一个网络上。

如果我从命令提示符处ping该机器,我也会获得IP信息。

C:\Users\anikumar>ping neemqx01g

Pinging neemqx01g.efi.internal [10.210.98.194] with 32 bytes of data:
Reply from 10.210.98.194: bytes=32 time=2ms TTL=128
Reply from 10.210.98.194: bytes=32 time<1ms TTL=128
Reply from 10.210.98.194: bytes=32 time<1ms TTL=128
Reply from 10.210.98.194: bytes=32 time<1ms TTL=128

Ping statistics for 10.210.98.194:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 2ms, Average = 0ms

如何在wxWidgets中以编程方式实现或者获取IP地址?

答案:

C函数:

const wxString GetIPbyName(const wxString& name)
{
    struct hostent* pHostInfo;
    pHostInfo = gethostbyname(name.c_str());

    in_addr * address = (in_addr *)pHostInfo->h_addr;
    std::string ip_address = inet_ntoa(*address);

    return ip_address;
}

wxWidgets的:

   wxIPV4address ipv4;
   ipv4.Hostname(m_currentServer);
   wxString m_currentServer = ipv4.IPAddress();

在多个活动网卡的情况下,我的上述行为并非如此。

2 个答案:

答案 0 :(得分:2)

我已经为您查看了文档,您无法

对于便携式网络名称查找,您可以考虑使用通用的跨平台网络库,例如 Boost.ASIO

答案 1 :(得分:1)

C套接字库(几乎)是可移植的。您将拥有旧的gethostbyaddr电话或较新的getaddrinfo电话。

但是你需要一些#ifdef来使它们真正可移植,因为:

  • 标头与Posix系统上的netdb.h(以及可选的sys / types.h和sys / socket.h)以及Windows上的Ws2tcpip.hwinsock2.h不一样
  • 在Windows上,您需要调用WSAStartup来初始化winsock。