4

当我尝试使用 IPv4 地址创建套接字时,它是成功的,但是当我尝试使用 IPv6 地址和端口号创建套接字时,它会引发异常:

java.net.SocketException: Network is unreachable: connect
          at java.net.DualStackPlainSocketImpl.connect0(Native Method)
          at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
          at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
          at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
          at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
          at java.net.PlainSocketImpl.connect(Unknown Source)
          at java.net.SocksSocketImpl.connect(Unknown Source)
          at java.net.Socket.connect(Unknown Source)
          at java.net.Socket.connect(Unknown Source)
          at java.net.Socket.<init>(Unknown Source)
          at java.net.Socket.<init>(Unknown Source)
          at epcs.intf.be.SimConnectionHandler.connect(SimConnectionHandler.java:332)
          at epcs.intf.be.BackEndConnection.connect(BackEndConnection.java:42)
          at epcs.intf.be.ProcedureRunner.runScenario(ProcedureRunner.java:230)
          at epcs.exec.Runner.SendExecTrigger(Runner.java:418)
          at epcs.exec.Runner.sendCommand(Runner.java:454)
          at epcs.main.ExecutionThread$TaskStartTestCaseExecution.run(ExecutionThread.java:98)
          at epcs.main.ExecutionThread.run(ExecutionThread.java:29)

代码:

我正在 Windows 机器上通过 Eclipse IDE 运行代码。

    if(p_objSimData.getIpAddress().contains(":") )
    {
        System.out.println("IPV6 Address Found\n");
        InetAddress ip6addr = Inet6Address.getByName(p_objSimData.getIpAddress());
        System.out.println("InetAddress ip6addr = "+ip6addr); **//prints  //2011::11 - IPv6 address**
        objConnection.m_objSocket = new Socket(ip6addr,p_objSimData.getPortNo()); -  **here it is throwing an exception** 
    }
    else
    {
        objConnection.m_objSocket = new Socket(p_objSimData.getIpAddress(),p_objSimData.getPortNo());
        //m_hmObjConnection1.put(p_objSimData.getIpAddress(), objConnection.m_objSocket);
        m_hmObjConnection1.put(p_objSimData.getIpPort(), objConnection.m_objSocket);
    }
4

1 回答 1

1

通常,此错误意味着远程机器的 V6 地址实际上并未绑定到给定端口。例如,如果您可以通过端口 80 上的 IPV4 与 Web 服务器通信,并不意味着它实际上将本地 V6 地址绑定到该端口。您仍然可以 ping 计算机,但 ping 实际上并不能告诉您端口是否已绑定。

证明您使用套接字的方式正确的快速测试是:

在 Eclipse Windows 机器上

  1. 在命令提示符处执行netstat -p TCPv6 -a
  2. 选择 localhost "::" 条目之一。在此示例中,我的机器返回 [::]:135 作为当前 V6 绑定端口之一。

尝试在 Eclipse 中连接:

public static void main(String[] args) {
  try
  {
    InetAddress address = InetAddress.getByName("::");
    Socket socket = new Socket(address, 135);
    // Should of connected with no exception thrown since we know this port was listening in netstat

  }
  catch (Throwable t) {
    t.printStackTrace();
  }
}

我知道以上内容对您当前的代码没有帮助,但它更旨在隔离 IPV6 地址和端口号未绑定并且套接字连接异常有效的可能性。

我做的另一个测试是我为我的 Linux 机器获取了 Inet6 地址,并确保 SSH 正在侦听该端口。然后,我在我的 Windows eclipse 中使用了上面相同的代码,并针对我的 Linux Inet6 地址和端口 22 进行了套接字。这也很好。我的本地 tomcat 失败了,因为它没有设置为在 Inet6 上侦听。

于 2013-04-22T20:39:56.837 回答