6

次のコードを想像してみてください。

String hostName = "0.0.0.0";
int port = 10002;
int timeout = 5000;
Socket socket = new Socket();
socket.connect(new InetSocketAddress(hostName, port), timeout);

Macでは正常に動作して接続を実行し(ポート10002で何も実行されていない場合でも)、Windowsでは次の例外が発生します。

java.net.SocketException: Permission denied: connect

ここでの違いは何ですか?Windowsでの代替手段は何ですか?これは単体テストで使用されます。

よろしく

ジョナス

4

1 に答える 1

6

他の誰かがこの質問に出くわした場合に備えて、私はそれに答えています。

残念ながら、Windowsでは任意のアドレスへの接続は許可されていません。

Winsock関数connectは、 Windows APIドキュメントに記載されているように、エラーコードWSAEADDRNOTAVAIL [リモートアドレスは有効なアドレスではありません(INADDR_ANYやin6addr_anyなど) ]を返します。

nameパラメーターで指定された構造体のアドレスメンバーがゼロで埋められている場合、connectはエラーWSAEADDRNOTAVAILを返します。

したがって、ローカルホストアドレスを使用しないと、Windowsでは実行しようとしていることは不可能だと思います(ただし、Unixの動作はバグなのか意図的なものなのか疑問に思います)。

Mark Reedがコメントで示唆したように、ループバックインターフェイスをさらに設定することをお勧めします。

于 2015-01-30T06:09:19.753 に答える