当前位置:编程学习 > C#/ASP.NET >>

处理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);
                 }
--------------------编程问答-------------------- 自己顶一下 --------------------编程问答-------------------- 不是很懂,帮你顶一下 --------------------编程问答-------------------- 自己顶一下 
--------------------编程问答-------------------- 你有丢包的情况吗? --------------------编程问答--------------------
引用 7 楼  的回复:
你有丢包的情况吗?

从接受字节上看,应该没有丢包
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,