2017-05-30 24 views
1

リクエストに応答するときに同じローカルポートにバインドする必要があります。 以下はJavaコードのサンプルです。 Linuxでは同じポートに2回、つまり をバインドできますが、Windowsでは2番目のバインドでエラーが発生します。エラーはBindExceptionです:アドレスはすでに使用中です。 Cで書かれた同様のプログラムでは、2回バインドすることができます。 Windows上のJavaがこれを行うのを妨げる原因は何ですか?バインドを許可するレジストリ設定はありますか?Windows Javaがすでにバインドされているポートにバインドできないのはなぜですか?

import java.net.InetSocketAddress; 
import java.net.Socket; 
import java.net.SocketAddress; 

public class SocketTest 
{ 
    public static void main(String[] args) throws Exception 
    { 
     Socket s1 = new Socket(); 
     s1.setReuseAddress(true); 
     SocketAddress saremote = new InetSocketAddress("google.com", 80); 
     SocketAddress salocal = new InetSocketAddress("10.1.1.98", 9990); 
     s1.bind(salocal); 
     s1.connect(saremote); 

     Socket s2 = new Socket(); 
     s2.setReuseAddress(true); 
     SocketAddress saremote2 = new InetSocketAddress("yahoo.com", 80); 
     SocketAddress salocal2 = new InetSocketAddress("10.1.1.98", 9990); 
     s2.bind(salocal2); 
     s2.connect(saremote2); 
    } 
} 
+1

ソケットストリーム接続はTCPであり、TCPでポートに一度しかバインドできない場合、同じポートに再バインドする前に接続を閉じる必要があります。 –

+0

Cプログラムはどのように似ていますか?私はそれが違う部分がここでは関連していると感じています。 – Joey

+0

*何が必要ですか?ファイアウォールでネット管理者が実装する、いわゆるセキュリティ機能の場合は、削除してください。セキュリティ上の利点はゼロであり、アプリケーションを実行不可能にします。 – EJP

答えて

0

これは、LinuxとWindowsの両方で可能です。同じポートを実行して使用している別のアプリケーション(おそらく、アプリケーションの以前のバージョン、終了していない可能性があります)があります。

+0

最初のバインドは常に成功し、ポートは使用可能です。 2番目のバインドは失敗します。 – user3375401

2

使用-Dsun.net.useExclusiveBind = falseを

WindowsプラットフォームでのネットワーキングAPIの実装に変更がありました。 デフォルトでSO_EXCLUSIVEADDRUSEソケットオプションを使用するように、WindowsではネットワーキングAPIの実装が変更されました。この変更は、同じポートにバインドする必要があるIPv4とIPv6の両方のアプリケーションを使用する場合に発生する異常に対処するために必要です。

この変更により、複数のプロセスを同じアドレスとポートにバインドする機能に依存するアプリケーションで問題が発生することがあります。このような問題が発生した場合、従来の動作を復元する一時的な回避策として、sun.net.useExclusiveBindシステムプロパティを使用します。

関連する問題