TCP消息损坏我有一个简单的TCP服务器通过GPRS与一些设备通信。它可以长时间正常工作,没有任何问题。现在,设备(客户端设备、发送数据)发生了变化,它们发送的数据比以前多得多,TCP消息大小可能比以前大10倍。以前它是最大1024字节/数据消息,现在它可以超过10,000字节/消息。正如我所看到的-正如TCP预测的那样-有许多消息被“损坏”,所以只有部分到达而不是完整的消息,稍后可以转到另一部分等。我认为我的服务器-基于异步模式-处理这种情况是错误的,我认为这个错误在我的RecieveCallBack函数中。我找不到正确处理这种情况的方法。我怎样才能做到这一点?这是我的RecieveCallBack函数:publicvoidRecieveCallBack(IAsyncResultar){StateObjectstate=(StateObject)ar.AsyncState;尝试{套接字处理程序=state.WorkSocket;intread=handler.EndReceive(ar);if(read>0){vardata=newbyte[read];Array.Copy(state.Buffer,0,data,0,读取);}else{if((handler.Connected==false)||(handler.Available==0)){关闭(状态);返回;}}}catch(System.Net.Sockets.SocketException){关闭(状态);}catch(System.Exceptionexc){Debug.Assert(false,exc.Message);HandleSocketError(状态,exc);}}.NET4/C#/VS2010感谢更新:客户端可以连接,所以可以连接到GSM网络。它们甚至可以连接数天并且每分钟发送一次数据。客户端设备的协议是不同的,不同类型的设备有不同种类的协议。其中一个在消息末尾有定界符和CRC,其他则没有。您需要消息传递框架。协议必须指定消息的大小——通常是已知大小常量、长度前缀或使用消息定界符。这不是TCP中的数据包。它是一个面向流的协议。这意味着当您从套接字读取时,您可以获得比预期更少的数据。需要检查readsize,如果有shortread,再读一遍剩下的数据。例如在C中:intread_data(intsock,intsize,unsignedchar*buf){intbytes_read=0,len=0;while(bytes_read0)){bytes_read+=len;}if(len==0||len我不确定应用程序的其余部分看起来如何,但我认为问题出在以下几行中:-Array.Copy(state.Buffer,0,data,0,read);如果数据包是分片的,即如果为同一个连接多次调用receive回调,state.Buffer会被最后一个接收到的数据包覆盖,也就是数据复制到state中offset0的时候.Buffer.根据你的需要,你可能需要添加Usemorestatein:)这样你就可以追加数据而不是覆盖。希望这个提示有所帮助。以上就是C#学习教程:TCP报文破坏分享的全部内容。如果对您有用,需要进一步了解C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
