c# socket tcp 接收到的内容乱了

qq_33368845 qq_33368845 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
实在找不出bug,只好来求助大佬们了。

情况是这样的,我的服务器每天大约能收到好几个内容错了的包,这几个包错得都很有规律。

比如客户端发送过来的内容为AAAABBBBCCCCDDDD 结果如下代码接收到的内容表现为AAAACCCCCCCCDDDD

也就是有4个字符不见了,而且必然多出4个字符,多出来的4个字符是从原本的内容中拷贝的,且紧靠被拷贝字符的位置。

我在本地服务器中进行了测试,然而不知出于什么原因,本地服务器一直接收到完整的包,并没有进入包头不全和包体不全的情况。

客户端发送速度为0.03秒一个包,大约进行了30万次发送,所有的包客户端都能正常收到。

我测试时是使用本地服务器与客户端。在同一台大脑内。

我的包头固定4个字符。


void CheckPackage()
{
if (isClose) return;
int length = 0;
isLost = false;
while (length < recieveLength)
{
//包头不全
if (length + 4 > recieveLength)
{
Tool.Debug.LogWarning("包头不全");
ContinueRecieve(length, recieveLength - length);
return;
}

//获取包头
int packageL = BitConverter.ToInt32(recive, length);

//异常包体
if (packageL > 8192) { Tool.Debug.LogWarning("[异常错误]" + "数据包长度为" + packageL.ToString()); break; }

int need = length + 4 + packageL;

//包体信息不全
if (recieveLength < need)
{
Tool.Debug.LogWarning("包体信息不全");
ContinueRecieve(length, recieveLength - length);
return;
}

length += 4;

//心跳
if (packageL == 0)
{
if (returnHeatBeat) { sendQueue.Enqueue(new byte[] { 0, 0, 0, 0 }); Send(); }
}
else
{
byte[] buff = new byte[packageL];
for (int i = 0; i < buff.Length; i++)
{
buff[i] = recive[i + length];
}
NetMessageManager.Instance.AddBuff(socket.RemoteEndPoint, buff, id);
}
length += packageL;
};

ContinueRecieve(0, 0);
}

void ContinueRecieve(int copyStart, int copyCount)
{
for (int i = 0; i < copyCount; i++)
recive[i] = recive[copyStart + i];
recieveLength = copyCount;
SocketError error3;
socket.BeginReceive(recive, copyCount, recive.Length - copyCount, SocketFlags.None, out error3, EndRecive, this);
}
...全文
评论 22
收藏 已收藏
分享
返回顶部
qq_33368845
C# 111,128 成员 642,536 内容