0

ソケットを開き、ソケットに作用し、ソケットを閉じて再起動するループがあります。ただし、2回目の繰り返しでSocketExceptionは、通常、各ソケットアドレス(プロトコル/ネットワークアドレス/ポート)の1つの使用のみが許可されます。
ただし、ソケットは閉じている必要がありますnetstat -a。そのポートなどでリッスンしていることは示されません。例外をスローするコードは次のとおりです。

_bindedLocalSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_bindedLocalSocket.Bind(new IPEndPoint(Util.ChannelProfileToListeningAddress(_profile), _profile.ListenPort));
_bindedLocalSocket.Listen(30);
_bindedLocalSocket.BeginAccept(new AsyncCallback(OnRequested), null);

ただし、犯人はそのコードではないと思います。そのコードに到達する直前で、接続を閉じようとする前に、次のようになります。

既存の接続がリモート ホストによって強制的に閉じられました
   System.Net.Sockets.Socket.EndReceive (IAsyncResult asyncResult) で
   Poderosa.PortForwarding.SynchronizedSocket.EndReceive (IAsyncResult ar) で
   Poderosa.PortForwarding.Channel.OnSocketData (IAsyncResult 結果) で

プログラムを閉じて再度実行すると、最初の接続が正常に行われ、2 番目の接続はまったく同じように動作します (SocketException)。これを修正する方法を知っている人はいますか?

4

2 に答える 2

5

私は socket.Close() がそれを処理すると思っていましたが、そうではないと思います。その場合、次を使用する必要があります。

socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

ソケット オプションの詳細については、こちらを参照してください。

于 2009-03-13T17:36:57.007 に答える
1

ソケットを閉じた場合でも、リソースが OS に解放されるまでに待機時間が発生することは、Windows の既知の問題です。

.NET でソケットの待機時間を手動で設定する方法がありますが、設計を再検討し、リスナー ソケットを閉じるのではなく開いたままにし、代わりに新しいソケットを閉じることをお勧めします。 Socket.Accept(); 中に作成されます。

于 2009-03-13T17:35:21.283 に答える