【发布时间】:2010-04-04 22:55:00
【问题描述】:
我有一个线程通过这样的套接字接收数据:
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);
}
}
}
而且我一直在我的解析函数中看到偶尔出现的错误,表明该消息无效。起初,我以为我的分词器类坏了。但是在将所有传入字节记录到标记器之后,结果发现 recvb 中的原始字节不是有效消息。我不认为像这样的损坏数据在 tcp 数据流中是可能的。
我认为它必须是某种类型的缓冲区溢出,所以我设置了
sock.ReceiveBufferSize = 1024 * 1024 * 8;
并且解析错误永远不会发生在测试中(如果我不更改 ReceiveBufferSize,它经常发生足以复制)。
但我的问题是:如果在我更改此缓冲区大小之前套接字的内部缓冲区溢出,为什么我没有看到异常或错误状态或其他什么?
【问题讨论】:
标签: c# .net networking sockets tcp