c# socket BeginReceive
理论上BeginReceive是非堵塞的,然而在实际应用中我发现有时候这个方法也会堵塞,而且是永久性的堵塞。
以下代码在信息不全的判定中出现多次堵死,且每次接收到的字节数都是1440.
void ReceiveEnd(System.IAsyncResult result)
{
SocketError error;
int originL = self.EndReceive(result,out error);
Debug.Log("接收:" +error + originL);
int currentL = 0;
delay = (int)(System.DateTime.Now - sendTime).TotalMilliseconds;
do
{
//包头不全
if (currentL + 4 > originL) { Debug.Log("包头不全:" + originL); ContinueRecieve( currentL, originL - currentL); return; }
//获取包头
int localLength = BitConverter.ToInt32(recive, currentL);
currentL += 4;
//心跳
if (localLength == 0) { Debug.Log("收到心跳回复"); continue; }
//信息不全
if (originL < currentL + localLength) { Debug.Log("信息不全:"+originL+" ->" + currentL); ContinueRecieve( currentL - 4, originL - (currentL - 4)); return; }
byte[] buff = new byte[localLength];
for (int i = 0; i < buff.Length; i++)
buff[i] = recive[i + currentL];
MessageManager.Instance.AddBuff( buff);
currentL += localLength;
} while (currentL < originL);
ContinueRecieve(0, 0);
}
void ContinueRecieve( int copyStart, int copyCount)
{
for (int i = 0; i < copyCount; i++)
recive[i] = recive[copyStart + i];
SocketError error3;
self.BeginReceive(recive, copyCount, recive.Length, SocketFlags.None, out error3, ReceiveEnd, self);
if (error3 != SocketError.Success)
{
Debug.LogWarning(error3 + "持续接收异常 - 可能停止该客户端的网络活动");
return;
}
}