我有一个简单的 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/