基本的な非同期ソケット サーバーがあります。最近、接続の 1 つが TCP ピアからの応答で次のエラーを受け取る断続的な期間が発生しています。
Exception message:
The output char buffer is too small to contain the decoded characters, encoding 'Unicode (UTF-8)' fallback 'System.Text.DecoderReplacementFallback'.
Exception stacktrace:
at System.Text.Encoding.ThrowCharsOverflow()
at System.Text.Encoding.ThrowCharsOverflow(DecoderNLS decoder, Boolean nothingDecoded)
at System.Text.UTF8Encoding.GetChars(Byte* bytes, Int32 byteCount, Char* chars, Int32 charCount, DecoderNLS baseDecoder)
at System.Text.DecoderNLS.GetChars(Byte* bytes, Int32 byteCount, Char* chars, Int32 charCount, Boolean flush)
at System.Text.DecoderNLS.GetChars(Byte[] bytes, Int32 byteIndex, Int32 byteCount, Char[] chars, Int32 charIndex, Boolean flush)
at System.Text.DecoderNLS.GetChars(Byte[] bytes, Int32 byteIndex, Int32 byteCount, Char[] chars, Int32 charIndex)
at System.IO.StreamReader.ReadBuffer()
at System.IO.StreamReader.ReadLine()
at MyServer.TcpReceiveMessages()
特定のネットワーク ルートでトラフィックが混乱していると思われます (アプリケーション/ネットワーク内の他の場所にある他の TcpListeners とピアは、常に 100% 正常に通信しています)。これをより正確に特定して修正するには、どのような手順を実行できますか?
(注、私はすでにパケット キャプチャを行っており、例外の原因となっている着信パケット処理は正常に見えます。つまり、ペイロードには必要なテキストが含まれているようです。そこにあるはずのペイロードの識別可能な部分があるため、見てください。 、しかし、マングルされたときにすぐに明らかにならないバイナリ部分もあります.)
リスナーの簡略化されたバージョン:
private void TcpReceiveMessages()
{
TcpClient tcpServer = new TcpClient();
string address = "some_address";
int port = 80;
tcpServer.Connect(address, port);
StreamReader srReceiver = new StreamReader(tcpServer.GetStream());
StringBuilder wholeMsg = new StringBuilder();
string partialMsg = "";
while (tcpServer.Connected)
{
try
{
//Save a partial portion of the reply:
partialMsg = srReceiver.ReadLine();
//Reply complete:
if ( partialMsg != null && partialMsg == "")
{
response = wholeMsg.ToString() + partialMsg;
//Misc response processing code.
}
}
catch (Exception ex)
{
//Do logging that leads to the above exception message/stacktrace
}
}
}