【发布时间】:2011-11-07 14:23:37
【问题描述】:
我有一个简单的 TCP 服务器,它通过 GPRS 与一些设备通信。它可以正常工作很长时间没有任何问题。如今,设备(发送数据的客户端设备)发生了变化,它们发送的数据比以前多得多,TCP 消息的大小可能比以前大 10 倍。以前最大1024字节/数据消息,现在可以超过1万字节/消息。
正如我所见 - 正如 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 网络。它们甚至可以连接数天,并且每分钟发送一次数据。客户端设备的协议不同,有不同类型的设备有不同的协议。其中一个在消息末尾有分隔符和CRC,其他没有。
【问题讨论】:
-
每次你写“pocket”时,你的意思是“packet”吗?
-
@Tom:“整个数据组”的正确术语是“消息”。 Stephen Cleary 是正确的,您的问题的明显解决方案是您需要实现或使用消息框架协议。我建议你考虑使用 HTTP。
-
您能否将有关该消息的已知信息添加到您的问题中(它们是否具有相同的格式,它们如何结束)。消息是在同一个连接上发送的,还是每次发送之间的连接都会终止?
-
感谢您的回复。詹姆斯,我添加到我的问题作为更新。
标签: c# .net sockets asynchronous tcp