
实在找不出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);
}