异步接收数据,第一次接收到不解析,第二次直接从上次的地方进行解析?

yuanyuanluoluo yuanyuanluoluo 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近在把同步改成异步通信,遇到一个奇怪的地方,接到数据后不直接解析,卡住不走了,然后第二次从卡住的地方直接运行解析数据,就是卡在这里:iBytesHead = ThisClient.Receive(recvBytes1, recvBytes1.Length, 0);
个人觉得这接收是不是还是同步接收,但是自己刚接触异步通信,想改却不知道怎么改,特来求助大佬,第一次输出2就不走了,第二次接到数据,直接输出3,然后往下运行了,奇数次就卡在2这,偶数次就直接从卡住的地方运行了,

public void recmessage(byte[] data)
{
if (ThisClient.Connected)
{

//接受消息头(消息校验码4字节 + 消息长度4字节 + 身份ID8字节 + 主命令4字节 + 子命令4字节 + 加密方式4字节 = 28字节)
int HeadLength = 28;
//存储消息头的所有字节数
byte[] recvBytesHead = new byte[HeadLength];
//如果当前需要接收的字节数大于0,则循环接收
while (HeadLength > 0)
{
byte[] recvBytes1 = new byte[28];
//将本次传输已经接收到的字节数置0
int iBytesHead = 0;
//如果当前需要接收的字节数大于缓存区大小,则按缓存区大小进行接收,相反则按剩余需要接收的字节数进行接收
if (HeadLength >= recvBytes1.Length)
{
log.text += "2";
iBytesHead = ThisClient.Receive(recvBytes1, recvBytes1.Length, 0);
log.text += "3";
}
else
{
iBytesHead = ThisClient.Receive(recvBytes1, HeadLength, 0);

}
//将接收到的字节数保存
recvBytes1.CopyTo(recvBytesHead, recvBytesHead.Length - HeadLength);
//减去已经接收到的字节数
HeadLength -= iBytesHead;
}
//接收消息体(消息体的长度存储在消息头的4至8索引位置的字节里)
byte[] bytes = new byte[4];
Array.Copy(recvBytesHead, 4, bytes, 0, 4);
int BodyLength = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(bytes, 0));
//存储消息体的所有字节数
byte[] recvBytesBody = new byte[BodyLength];
//如果当前需要接收的字节数大于0,则循环接收
while (BodyLength > 0)
{
byte[] recvBytes2 = new byte[BodyLength < 1024 ? BodyLength : 1024];
//将本次传输已经接收到的字节数置0
int iBytesBody = 0;
//如果当前需要接收的字节数大于缓存区大小,则按缓存区大小进行接收,相反则按剩余需要接收的字节数进行接收
if (BodyLength >= recvBytes2.Length)
{
iBytesBody = ThisClient.Receive(recvBytes2, recvBytes2.Length, 0);
}
else
{
iBytesBody = ThisClient.Receive(recvBytes2, BodyLength, 0);
}
//将接收到的字节数保存
recvBytes2.CopyTo(recvBytesBody, recvBytesBody.Length - BodyLength);
//减去已经接收到的字节数
BodyLength -= iBytesBody;
}
string res = DataPackagesTransform.UnpackDataToStr(recvBytesHead, recvBytesBody);
RecMsg.Enqueue(res);
log.text += "队列加入元素";
}
}
...全文

相关推荐

评论 8
收藏 已收藏
分享
返回顶部
yuanyuanluoluo
C# 111,128 成员 642,536 内容