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 "::" エントリの 1 つを選択します。この例では、私のマシンは現在の V6 バインド ポートの 1 つとして [::]:135 を返しています。

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 に対してソケットを実行しました。これも問題なく機能しました。Inet6 でリッスンするように設定されていなかったため、ローカルの tomcat が失敗しました。

于 2013-04-22T20:39:56.837 に答える