私は、.NETコアにクライアント/サーバソケットライブラリを作成する段階にあり、別のプロジェクトで使用するための基本的なモデルです。.NETコアでソケット受信を終了する
クライアントでは、1つはリスン、1つは送信、もう1つは受信したメッセージをコンシューマに返す3つのスレッドがあります。
クライアントを閉じるためにシャットダウン機能を実装しようとしています。送信機能と受信機能は両方とも消費者であるため、ManualResetEventを確認するように指示するのは簡単です。
しかし、受信スレッドを閉じるための唯一の方法は、socket.Shutdown()を実行することです。これは、スレッドがsocket.Recieve()でスタックされているためです。このため、リスンスレッドでSocketExceptionがスローされ、キャッチされ、処理され、きれいに閉じられます。しかし、私の問題はSocketExceptionのNativeErrorCodeがなぜクローズしているのかを判断できないときに発生します。
NativeErrorCode 10004エラーだけで、すべてのSocketExceptionsをキャッチしてエラーを隠したくありません。 NativeErrorCodeはSocketExceptionクラスでアクセス可能ではありませんが、IntelliSenseでこれを見ることはできますか?
private void ListenThread()
{
//Listens for a recieved packet, first thing reads the 'int' 4 bytes at the start describing length
//Then reads in that length and deserialises a message out of it
try
{
byte[] lengthBuffer = new byte[4];
while (socket.Receive(lengthBuffer, 4, SocketFlags.None) == 4)
{
int msgLength = BitConverter.ToInt32(lengthBuffer, 0);
if (msgLength > 0)
{
byte[] messageBuffer = new byte[msgLength];
socket.Receive(messageBuffer);
messageBuffer = Prereturn(messageBuffer);
Message msg = DeserialiseMessage(messageBuffer);
receivedQueue.Enqueue(msg);
receivedEvent.Set();
MessagesRecievedCount += 1;
}
}
}
catch (SocketException se)
{
//Need to detect when it's a good reason, and bad, NativeErrorCode does not exist in se
//if(se.NativeErrorCode == 10004)
//{
// }
}
}