0

次のように、割り当てられたポート番号でローカルホストをリッスン するリスナーがあります。

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リスナーからポート番号を取得したいからです。このポート番号は、プログラムの個々のインスタンスに割り当てられるポート番号である必要があります。

4

2 に答える 2

0

質問のコメントに基づいて、最善の解決策は、プログラムがリッスンしているポート番号をソケット接続を介して送信することです。

于 2013-10-13T18:46:18.377 に答える