【问题标题】:How do you get the ip address from a remote machine?如何从远程机器获取 IP 地址?
【发布时间】:2009-03-10 13:28:05
【问题描述】:

我正在编写需要在 windows 和 linux 上运行的 c++ 代码,并且我正在寻找一个函数调用,该函数调用将返回运行应用程序的机器的 IP 地址。有这样的吗?

【问题讨论】:

  • “远程”是什么意思?
  • 你的意思是你想让应用发现它运行的机器的IP?一个有多个ip的盒子呢?一个有一些与互联网对话的 ip 和一些是本地 IP 的呢?

标签: c++ windows linux sockets cross-platform


【解决方案1】:

如果您可以使用 boost,请查看
How to get IP addresss of boost::asio::ip::tcp::socket?

【讨论】:

    【解决方案2】:

    调用socket(),然后调用getsockname()。

    【讨论】:

    • 是跨平台解决方案吗?
    • socket() 肯定是 BSD 套接字的一部分,因此是跨平台的 - 我自己在 Free BSD 上使用它。谷歌表示,getsockname() 存在于 Linux 上,并且在 man 中被提及,因此它也可能是跨平台的。我一般只在 Win32 上使用这种方法。
    【解决方案3】:

    您可以这样做,但这通常是个坏主意。

    “man netdevice”中描述的 ioctl SIOCGIFCONF 解释了这一点。

    这是一个坏主意的原因是你可能无法从中得到你想要的。

    这台机器可能有多个或多个 IP 地址,你不会知道哪些是 民众。它可能在一个 NAT 网关(或多个)后面,在这种情况下,它们都不是 可能是公开的。

    你只是不能特别有用地使用这些信息。不管你想要什么,它就是 这样做可能不是一个好主意。

    【讨论】:

      【解决方案4】:

      最好的办法是使用网络服务。连接到已知服务器,让它发回您用来联系它的 IP。这将告诉您 PC 在与外界通信时使用的 IP 地址(好的,一个 IP 地址)。

      可能的例外情况及其无关紧要的原因:

      • 您获得了 NAT 设备的地址 - 好吧,在这种情况下,您的 PC 没有 Internet 地址,您打算如何处理您可能拥有的 10.x.y.z 地址?
      • 您根本没有地址,因为您没有连接到 Internet - 如果您无法连接,则另一台计算机不太可能对您的 IP 地址做任何有用的事情。
      • 您确实获得了一个 IP,但没有人可以连接到它 - 您可能位于拒绝任何传入连接的过滤防火墙后面。防火墙不太可能接受连接到同一台计算机的另一个 IP 地址上的流量。即使是这样,也可能无法发现。这对 FTP 来说简直就是地狱。

      【讨论】:

        【解决方案5】:

        如果您知道应用程序运行的机器的名称,只需使用 gethostbyname()。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-14
          • 2012-03-01
          • 2012-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-28
          • 2016-10-17
          相关资源
          最近更新 更多