private void ProcessRecvCallback(IAsyncResult ar)
{
try
{
int readed = _client.GetStream().EndRead(ar);
if (readed == 0)
{
_logger?.Info("ProcessRecvCallback readed == 0");
Close();
return;
}
_recvBufLen += readed;
}
catch (SocketException e)
{
_logger?.Info("ProcessRecvCallback Exception", e);
Close((int)e.SocketErrorCode);
return;
}
catch (Exception e)
{
_logger?.Info("ProcessRecvCallback Exception", e);
Close();
return;
}
while (true)
{
using (var ms = new MemoryStream(_recvBuf, 0, _recvBufLen, false, true))
{
var length = _packetSerializer.PeekLength(ms);
if (length > _recvBuf.Length)
{
_logger?.ErrorFormat("ProcessRecvCallback got too large packet. Length={0}", length);
Close();
return;
}
if (length == 0 || _recvBufLen < length)
break;
try
{
var packet = _packetSerializer.Deserialize(ms);
_lastReceiveTime = DateTime.UtcNow;
if (Received != null)
Received(this, packet);
}
catch (Exception e)
{
_logger?.Error("Deserialize Error", e);
Close();
return;
}
int leftLen = _recvBufLen - length;
if (leftLen > 0)
{
Array.Copy(_recvBuf, length, _recvBuf, 0, leftLen);
_recvBufLen = leftLen;
}
else
{
_recvBufLen = 0;
}
}
}
ProcessRecv();
}
}