.NET套接字缓冲区溢出没有错误

时间:2010-04-04 22:55:00

标签: c# .net networking sockets tcp

我有一个线程通过套接字接收数据,如下所示:

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类已被破坏。但是在将所有传入的字节记录到tokenizer之后,事实证明recvb中的原始字节不是有效的消息。我不认为使用tcp数据流可能会损坏这样的数据。

我认为它必须是某种类型的缓冲区溢出所以我设置

sock.ReceiveBufferSize = 1024 * 1024 * 8;

并且在测试中永远不会发生解析错误(如果我不更改ReceiveBufferSize,它通常足以复制)。

但我的问题是:为什么在更改此缓冲区大小之前,如果套接字的内部缓冲区溢出,我是否看到异常或错误状态?

2 个答案:

答案 0 :(得分:4)

我假设你的tokenizer需要文本(Utf8?)但(socket)流可以使用字节数据。在传输中可能会分割多字节字符。小缓冲区会增加发生这种情况的可能性。

如果你使用的是ASCII,那么你就是安全的,否则解决方案就是使用TextReader作为中间文件。

答案 1 :(得分:2)

我还建议确认数据的发送方正在检查成功写入的字节数,而不是假设所有字节都写成功。

使用Socket.Send时这是一个常见的错误,并且可以解释为什么当你提高缓冲区大小时会发现问题消失。

在成功写入所有字节之前,发送方有责任重试。