次のように、割り当てられたポート番号でローカルホストをリッスン するリスナーがあります。
TcpListener listener = new TcpListener(localIP);
listener.Start();
while (true) {
listen:
if (!listener.Pending()) {
Thread.Sleep(100);
goto listen;
}
Socket socket = listener.AcceptSocket();
}
同じプログラムが、このプログラムの他のインスタンスに次のように接続する必要があります。
TcpClient client = new TcpClient(localIP); //localendpoint should use same port
client.Connect("localhost", remotePort);
ご覧のとおり、リスナーとクライアントIPEndPoint localIP
の両方に同じものをバインドしています。そのため、プログラムの別のインスタンスがこのインスタンスと接続している場合はいつでも、リスナーのソケットがそれを提供できます。システムによって生成されたランダムなポート番号を取得しないようにします。もちろん、これは機能せず、次のエラーが発生します。RemoteEndPoint
通常、各ソケット アドレス (プロトコル/ネットワーク アドレス/ポート) の使用は 1 つだけ許可されます。
リスナーとクライアントの両方が同じ にバインドされているためIPEndPoint localIP
です。
リスナーとクライアントを同じ EndPoint にバインドできるようにするための回避策はありますか? socket.RemoteEndPoint
リスナーからポート番号を取得したいからです。このポート番号は、プログラムの個々のインスタンスに割り当てられるポート番号である必要があります。