【问题标题】:getLocalAddress() returning 0.0.0.0getLocalAddress() 返回 0.0.0.0
【发布时间】:2012-05-05 02:57:36
【问题描述】:

我正在尝试使用 Sockets 编写程序,我需要获取自己的本地 IP 地址。

当我在套接字中使用 getLocalAddress 时,我只得到 0.0.0.0。

这是我的一小段代码:

DatagramSocket socket;
DatagramPacket pacoteEnvio = new DatagramPacket(msgByte, msgByte.length, addr, 6500);
socket = new DatagramSocket();
System.out.println("Local address = " + socket.getLocalAddress());
socket.send(pacoteEnvio);

你有什么想法吗?

我正在使用 UDP,所以我不确定我是否可以通过这种方式获取我的 IP,因为它是无连接的,但我认为你可以帮助我!

【问题讨论】:

  • 你的socket没有绑定,这就解释了0 0 0 0地址
  • 我试图绑定它进行测试,但我收到消息:它已经绑定了..

标签: java sockets udp


【解决方案1】:

使用这样的机制获取本地地址通常不会以您期望的方式工作。一个系统一般至少有两个地址——127.0.0.1ip address of nic,当你绑定到一个地址监听的时候,就是绑定到INADDR_ANY,和0.0.0.0的地址一样,和绑定到@一样987654325@ ip address of nic。考虑一台带有有线和无线网卡的笔记本电脑——它们中的一个或两个可以同时连接。在这种情况下,哪个会被视为系统的 IP 地址?

我偷了enumerating the ip addresses of all enabled NIC cards 答案的子集,它处理所有 NIC 的地址,其中列出了所有接口的 IP 地址,在我的系统上我有 10 个接口,所以我最终得到了很多IP 地址。

try {
  System.out.println("Full list of Network Interfaces:");
  for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
      NetworkInterface intf = en.nextElement();
      System.out.println("    " + intf.getName() + " " + intf.getDisplayName());
      for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
          System.out.println("        " + enumIpAddr.nextElement().toString());
      }
  }
} catch (SocketException e) {
  System.out.println(" (error retrieving network interface list)");
}

一般来说,如果您是服务器编程,当您在 UDP 服务上收到一个数据包时,它包含发送者的 IP 地址,您只需将响应发送到该地址,并且计算机足够聪明,可以将其发送出去正确的网络接口。

【讨论】:

    【解决方案2】:

    我正在从事一个类似的项目 - 一个贝尔福德人客户项目。我一开始尝试了你的方式,也得到了 0.0.0.0。然后我通过使用 InetAddress 的方法将地址输出为字符串来解决这个问题 - 不涉及数据报套接字。

    String localIP = InetAddress.getLocalHost().getHostAddress();
    System.out.println(localIP);
    

    我显示了我的内部 IP - 分配给我的路由器的 IP。这对我来说已经足够了。希望这可以帮助。

    【讨论】:

      【解决方案3】:

      你可以试试:

      InetAddress ip = InetAddress.getLocalHost();

      http://docs.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.html

      公共DatagramSocket(int端口, InetAddress 梯形图) 抛出 SocketException

      创建一个数据报套接字,绑定到指定的本地地址。本地端口必须介于 0 和 65535 之间(含)。如果 IP 地址为 0.0.0.0,则套接字将绑定到通配符地址,即内核选择的 IP 地址。

      【讨论】:

        【解决方案4】:

        DatagramSocket.getLocalAddress() 的 javadoc 这么说

        返回 - 套接字绑定的本地地址,null 如果套接字已关闭,或者 InetAddress 表示通配符地址,如果套接字未绑定或安全管理器 checkConnect 方法未绑定允许操作。

        如果您使用无参数构造函数创建 DatagramSocket,您将获得一个未绑定的套接字,因此(根据 javadoc)getLocalAddress() 应返回通配符 IP 地址 0.0.0.0。确实如此。

        您可以通过阅读文档学到的东西令人惊讶:-)

        【讨论】:

          【解决方案5】:

          虽然 DatagramSocket 没有连接,但它没有绑定本地机器上的任何端口,所以它的 IP 是 0.0.0.0 。尝试与socket.connect(SocketAddress addr) 建立联系,然后你会得到正确的结果。在socket.disconnect() 方法之后,您将获得相同的 0.0.0.0 ip 地址。

          【讨论】:

          • 但是我正在广播,所以我没有任何地址可以连接。
          • 尝试连接到本地主机(在那里找到一个空闲端口)
          猜你喜欢
          • 2014-04-15
          • 2013-09-02
          • 2012-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-02
          • 1970-01-01
          • 2013-09-25
          相关资源
          最近更新 更多