2016-06-30 9 views

答えて

-2

しばらくして解決策を見つけました。 Socket.Blockingプロパティをfalseに設定するだけです。次に、Socket.Accept関数は、保留中の接続があるかどうかをチェックします。保留中の接続があれば、この接続を受け入れます。SocketException.ErrorCodeが "10035"の場合はSocketExceptionがスローされます。このタイプの例外がエラーコード "10035"でスローされた場合は、終了するかどうかをチェックし、終了する場合は終了し、そうでなければSocket.Accept関数を呼び出して手順を繰り返します。

注:同じ方法で他のブロッキングメソッドを呼び出して、実際にスレッドの実行をブロックすることができます。

出典:

https://msdn.microsoft.com/en-us/library/system.net.sockets.socket.blocking(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx

+1

これは忙しい回転になり、CPUを100%に駆動します。遅延を追加する必要があります。この遅延により、接続を受け入れるときに遅延が発生し、受け入れられる1秒あたりの接続数が大幅に制限されます(100kから10msの遅延で100になる)が、まだ効率が悪く、コードがより扱いにくいです。また、このようなコードはモバイルデバイスのバッテリを放電させることにも注意してください。私はソケットを閉じることをお勧めします。 – usr

+1

また、例外は非常に高価(0.1ms)なので、実際には相当なCPU時間になります。また、デフォルトの設定であるすべての例外をブレークするようにデバッガを設定することはできません。デバッグ出力が汚染されます。 – usr

3

TCPはどのような状況でもメッセージを確認できないようにメッセージを提供しません。 は少なくとものバイト数が表示されますが、メッセージではない可能性があります。複数のメッセージである可能性があります。また、1ns後のデータが到着すると、Available0になる可能性があります。テストはあなたに何も買わない。

データや接続を確認する必要はありません。

ただ受け入れるループを実行します。

while (true) { 
RunConnectionAsync(socket.Accept()); 
} 

読書のための同じ:データが来るかもしれないときに、すべての回で優れた読み取り要求を持っています。 Readは、データが到着するまで待機します。

Do。またはしないでください。試着はありません。 (この場合は常に実行します)

+1

私は外部のスレッドでこれをやっているので、それが非同期であるが、私は順番にブロックされるスレッドのことができるようにしたくありませんそれを平和的に終わらせてください。 – None

+0

ソケットを終了する一般的な方法は、ソケットを閉じることです。よりクリーンな方法はありません。あなたが好きでないなら、これは非常に醜いポーリングの解決を強制します。解決策はよりクリーンです。 – usr

+0

誰かがGithubのソケット操作をキャンセルするためのより良いAPIをリクエストしました:https://github.com/dotnet/corefx/issues/5749 – usr

関連する問題