c# - TCP 消息损坏

标签 c# .net sockets asynchronous tcp

我有一个简单的 TCP 服务器,它通过 GPRS 与某些设备进行通信。可以长期正常工作,没有任何问题。如今,设备(发送数据的客户端设备)发生了变化,它们发送的数据比以前多得多,并且 TCP 消息大小可能比以前大 10 倍。之前最大为 1024 字节/数据消息,现在可以超过 10,000 字节/消息。

正如我所见 - 正如 TCP 的本质所预测的 - 有很多消息被“损坏”,因此只有其中一部分到达,而不是完整的消息,稍后可能会出现另一部分,等等。

我认为我的服务器(基于异步模式)以错误的方式处理这种情况,并且我认为错误出在我的 RecieveCallBack 函数中。我找不到处理这种情况的正确方法。我怎样才能做到这一点?

这是我的 RecieveCallBack 函数:

public void RecieveCallBack(IAsyncResult ar)
    {
        StateObject state = (StateObject)ar.AsyncState;

        try
        {
            Socket handler = state.WorkSocket;

            int read = handler.EndReceive(ar);

            if (read > 0)
            {
                var data = new byte[read];
                Array.Copy(state.Buffer, 0, data, 0, read);
            }
            else
            {
                if ((handler.Connected == false) || (handler.Available == 0))
                {
                    Close(state);
                    return;
                }
            }
        }
        catch (System.Net.Sockets.SocketException)
        {
            Close(state);
        }
        catch (System.Exception exc)
        {
            Debug.Assert(false, exc.Message);
            HandleSocketError(state, exc);
        }
    }

.net4/c#/vs2010

谢谢

更新: 客户端能连接就连接,所以这取决于 GSM 网络。它们甚至可以连接数天,并且每分钟发送数据。客户端设备的协议(protocol)不同,不同类型的设备具有不同类型的协议(protocol)。其中一种在消息末尾有分隔符和CRC,其他则没有。

最佳答案

您需要message framing 。协议(protocol)必须指定消息的大小 - 通常是众所周知的恒定大小、长度前缀或使用消息分隔符。

关于c# - TCP 消息损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7257139/

相关文章:

c# - 在不调试的情况下将测试日志写入 Visual Studio 输出 Pane ?

c# - 如何在 .NET 紧凑型框架中获取默认系统字体?

c# - 我应该在关闭后手动处理套接字吗?

c++ - 套接字关闭时管道破裂

c# - 使用 OpenPop 将电子邮件移动到另一个文件夹

c# - 我将如何更改按钮的边框颜色?

c# - Xaml 使状态栏停靠在底部

.net - 在 .NET 中共享程序集

c# - 在 ODataController 中使用服务引用不适用于 IIS

python - 保持客户端连接