void OnReceive (IAsyncResult result)
{
if (stage == Stage.NotConnected) return;
int bytes = 0;
try
{
bytes = mSocket.EndReceive(result);
}
catch (System.Exception ex)
{
Error(ex.Message);
Disconnect();
return;
}
lastReceivedTime = DateTime.Now.Ticks / 10000;
if (bytes == 0)
{
UnityEngine.Debug.Log ("OnReceive called Close(true) 1");
Close(true);
}
else if (ProcessBuffer(bytes))
{
if (stage == Stage.NotConnected) return;
try
{
// Queue up the next read operation
mSocket.BeginReceive(mTemp, 0, mTemp.Length, SocketFlags.None, OnReceive, null);
}
catch (System.Exception ex)
{
Error(ex.Message);
UnityEngine.Debug.Log ("OnReceive called Close(false) 2");
Close(false);
}
}
else
{
UnityEngine.Debug.Log ("OnReceive called Close(true) 3");
Close(true);
}
}
/// <summary>
/// See if the received packet can be processed and split it up into different ones.
/// </summary>
bool ProcessBuffer (int bytes)
{
if (mReceiveBuffer == null)
{
// Create a new packet buffer
mReceiveBuffer = Buffer.Create();
mReceiveBuffer.BeginWriting(false).Write(mTemp, 0, bytes);
}
else
{
// Append this data to the end of the last used buffer
mReceiveBuffer.BeginWriting(true).Write(mTemp, 0, bytes);
}
for (int available = mReceiveBuffer.size - mOffset; available >= 4; )
{
// Figure out the expected size of the packet
if (mExpected == 0)
{
mExpected = mReceiveBuffer.PeekInt(mOffset);
if (mExpected < 0 || mExpected > 16777216)
{
Close(true);
UnityEngine.Debug.Log ("ProcessBuffer called close(true)");
return false;
}
}