我有一个线程是通过套接字这样接收数据:.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