リクエストに応答するときに同じローカルポートにバインドする必要があります。 以下は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);
}
}
ソケットストリーム接続はTCPであり、TCPでポートに一度しかバインドできない場合、同じポートに再バインドする前に接続を閉じる必要があります。 –
Cプログラムはどのように似ていますか?私はそれが違う部分がここでは関連していると感じています。 – Joey
*何が必要ですか?ファイアウォールでネット管理者が実装する、いわゆるセキュリティ機能の場合は、削除してください。セキュリティ上の利点はゼロであり、アプリケーションを実行不可能にします。 – EJP