处理BeginReceive接收数据的问题
BytesHaveRecvCount:为BeginReceive接收的字节数。lengthOfMessage:本次数据包发送的数据包长度
lengthOfActualMessage:需要接收数据的总长度
包头为10个字节,每个发送的数据包都包含包头,包头最后一个字节为序号
一下是一段日志:
2012-9-28 10:25:09 包头:0,10,0,0,A,5E,0,0,3,12012-9-28 10:25:09 BytesHaveRecvCount,lengthOfMessage,lengthOfActualMessage 4096,4096,24074
2012-9-28 10:25:09 BlockSize,BytesHaveRecvCount4096,4096
2012-9-28 10:25:09 bytesrecvAlreadyCount,recvBytesRemainingCount,lengthOfActualMessage 4086,19988,24074
2012-9-28 10:25:09 包头:4E,45,58,54,5F,4F,46,5F,4B,49
2012-9-28 10:25:09 包头:4E,45,58,54,5F,4F,46,5F,4B,49
2012-9-28 10:25:09 BytesHaveRecvCount,lengthOfMessage,lengthOfActualMessage 442,1415071054,1598443359
2012-9-28 10:25:09 BytesHaveRecvCount,lengthOfMessage,lengthOfActualMessage 3654,1415071054,1598443359
2012-9-28 10:25:09 包头:0,10,0,0,A,5E,0,0,FF,32012-9-28 10:25:09 BytesHaveRecvCount,lengthOfMessage,lengthOfActualMessage 4096,4096,24074
2012-9-28 10:25:09 包头:0,10,0,0,A,5E,0,0,FF,42012-9-28 10:25:09 BytesHaveRecvCount,lengthOfMessage,lengthOfActualMessage 4096,4096,24074
2012-9-28 10:25:09 包头:0,10,0,0,A,5E,0,0,FF,52012-9-28 10:25:09 BytesHaveRecvCount,lengthOfMessage,lengthOfActualMessage 4096,4096,24074
2012-9-28 10:25:09 包头:46,E,0,0,A,5E,0,0,FF,62012-9-28 10:25:09 BytesHaveRecvCount,lengthOfMessage,lengthOfActualMessage 3654,3654,24074
错误发生在第2包,包头变成包体里的一部分数据了。绿色部分说明回调函数执行了两遍(一次BeginReceive)
一次为442字节数,一次为3654,加起来正好是BeginReceive接收时的缓冲区。
不知道这是什么问题导致的?望高手指点。 --------------------编程问答-------------------- 执行了两遍,那你断点,看看是从哪里出发了回调函数,肯定是有地方没控制好,造成重复执行 --------------------编程问答-------------------- 重复执行应该是没控制好,但问题的关键是BeginReceive接收的数据包没有发送的包头部分,导致解析失败。
红色数字为包头序号(与日志日志连接了,抱歉), --------------------编程问答-------------------- 不是所有的包都错误,有时是正常的。maxBufferSize :4096
--------------------编程问答-------------------- 自己顶一下 --------------------编程问答-------------------- 不是很懂,帮你顶一下 --------------------编程问答-------------------- 自己顶一下
if (bytesRead > 0)
{
//设置接收数据的时间
Client.LastPacketTime = DateTime.Now;
PrefixHandler.HandlePrefix(ClientDataHolder, bytesRead,this,Client);
//数据接收完毕
if (ClientDataHolder.recvBytesRemainingCount == 0)
{
//showmsg
string Msg = ClientDataHolder.ShowData();
if (OnResponseData != null)
OnResponseData(Msg);
//Handle Data
HandleRecvPacket(Msg, Client);
//reset Data to Recv
ClientDataHolder.ResetRecv();
ClientDataHolder.ResetlistOfMessagesReceived();
StartRecive(Client);
}
else if (ClientDataHolder.recvBytesRemainingCount > 0)
{
int BytesBlockRecv = ClientDataHolder.recvBytesRemainingCount + ClientDataHolder.HeadPacketLength > maxBufferSize ? maxBufferSize : ClientDataHolder.recvBytesRemainingCount + ClientDataHolder.HeadPacketLength;
Array.Clear(Client.SocketData.dataMessageReceived, 0, Client.SocketData.dataMessageReceived.Length);
Client.ClientSocket.BeginReceive(Client.SocketData.dataMessageReceived,
0,
BytesBlockRecv,
SocketFlags.None,
new AsyncCallback(ReadCallback),
Client);
}
--------------------编程问答-------------------- 你有丢包的情况吗? --------------------编程问答--------------------
从接受字节上看,应该没有丢包
补充:.NET技术 , C#