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

2024-03-19

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

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,这种错误发生的频率足以复制)。

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


我假设您的标记生成器需要文本(Utf8?),但(套接字)流使用字节数据。多字节字符可能在传输中被分割。小缓冲区会增加发生这种情况的可能性。

如果您使用 ASCII,那么您是安全的,否则解决方案将在于使用 TextReader 作为中间值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET 套接字缓冲区溢出没有错误 的相关文章

随机推荐