我有一個線程是通過套接字這樣接收數據:.NET套接字緩衝區溢出沒有錯誤
while (sock.Connected)
{
// Receive Data (Block if no data)
recvn = sock.Receive(recvb, 0, rlen, SocketFlags.None, out serr);
if (recvn <= 0 || sock == null || !sock.Connected)
{
OnError("Error In Receive, recvn <= 0 || sock == null || !sock.Connected");
return;
}
else if (serr != SocketError.Success)
{
OnError("Error In Receive, serr = " + serr);
return;
}
// Copy Data Into Tokenizer
tknz.Read(recvb, recvn);
// Parse Data
while (tknz.MoveToNext())
{
try
{
ParseMessageAndRaiseEvents(tknz.Buffer(), tknz.Length);
}
catch (System.Exception ex)
{
string BadMessage = ByteArrayToStringClean(tknz.Buffer(), tknz.Length);
string msg = string.Format("Exception in MDWrapper Parsing Message,
Ex = {0}, Msg = {1}", ex.Message, BadMessage);
OnError(msg);
}
}
}
我總是看到在我的分析功能偶然的錯誤指示該消息是無效的。起初,我認爲我的tokenizer類被破壞了。但是,在將所有傳入字節記錄到標記器後,事實證明recvb中的原始字節不是有效的消息。我不認爲這樣的數據流是可以通過tcp數據流破壞的。
我想它必須是某種類型的緩衝區溢出,所以我設置
sock.ReceiveBufferSize = 1024 * 1024 * 8;
,從不解析錯誤,曾經發生在測試(它發生的頻率足以複製,如果我不改變ReceiveBufferSize )。
但我的問題是:爲什麼我沒有看到一個異常或錯誤狀態,或者如果在更改此緩衝區大小之前套接字的內部緩衝區溢出了?
感謝您的回覆。這是一個很好的觀點,它可能在發件人一方。這將解釋爲什麼套接字不報告任何錯誤。如果字節正確傳遞,但發件人有一些問題,而不是全部發送給我,因爲緩衝區已滿,那可能就是這樣。我想我應該用wireshark捕獲服務器發送的數據包來確認。 – 2010-04-05 02:19:25
我想你的權利,設法讓服務器的人今天和他的日誌文件記錄輸出:「發送():短送98,應該是106.」 所以看起來他沒有發送所有東西,因爲我的接收緩衝區已滿。謝謝你的幫助! – 2010-04-05 19:01:37