2009-03-13 9 views
0

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

_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); 

はしかし、私はそのコードを取得する直前に、犯人はそのコードではないと思うし、私はこれを取得、接続を閉じる前に:

An existing connection was forcibly closed by the remote host 
    at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult) 
    at Poderosa.PortForwarding.SynchronizedSocket.EndReceive(IAsyncResult ar) 
    at Poderosa.PortForwarding.Channel.OnSocketData(IAsyncResult result)

プログラムを閉じてもう一度実行すると、最初の接続が正常に行われ、2番目の接続はまったく同じ(SocketException)となります。 誰も私がこれをどのように修正できるか考えていますか?

答えて

5

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

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

あなたはソケットオプションhereについての詳細を読むことができます。

+0

これで問題は解決しましたが、私はプログラムがソケットソケットにアクセスしようとしたときに問題に遭遇しています:( – Malfist

+1

socket.close()を使用している場合、新しいソケットオブジェクトをすべて作成する必要があります。同じオブジェクトを使用するには、socket.disconnect()を使う必要があると思います。MSDNのドキュメントを見てください - 私は100%確信していませんが、接続が切断されていると確信しています。 – ryeguy

+0

私は閉じていますソケットのクローズを処理するSSHConnection、またはそうするはずです... – Malfist

1

これはWindows上で既知の問題です。ソケットを閉じても、リソースがOSに戻されるまでに待ち時間があります。

.NETのソケットの待ち時間を手動で設定する方法がありますが、デザインを見直して、リスナーソケットを閉じずに開いたままにして、代わりにSocket.Accept()中に作成される新しいソケット。

+0

ソケットを閉じないと、もう一方の端で閉じてしまい、制御できません。私はrsyncをソケット上で実行しています。これはポート転送されたSSH接続(Windowsマシンポート873からrsyncマシンポート873へ)です。だから私はそれを変更することはできません、回避策はありますか? – Malfist

+0

私は30秒の睡眠を入れ、それは役に立たなかった。 – Malfist

+0

SetSocketOptionでRyeguyのソリューションを試してください。 リモート接続がリスナーソケットを閉じる可能性があることに気づいていませんでした。 – Alan

関連する問題