private void ReceiveCallback(IAsyncResult ar)
{
try
{
StateObject state = (StateObject)ar.AsyncState;
Socket client = state.WorkSocket;
// this method can be called from the middle of a .Disconnect() call
// test with Debug > Exception > CLR exs on
if (!client.Connected)
{
return;
}
int bytesRead = client.EndReceive(ar);
if (state.Buffer[7] == 0x02)
{
SendAcknowledgePacket(Helpers.Bytes2String(new[] { state.Buffer[8] }));
OnBattlEyeMessage(Helpers.Bytes2String(state.Buffer, 9, bytesRead - 9), 256);
}
else if (state.Buffer[7] == 0x01)
{
if (bytesRead > 9)
{
if (state.Buffer[7] == 0x01 && state.Buffer[9] == 0x00)
{
if (state.Buffer[11] == 0)
{
state.PacketsTodo = state.Buffer[10];
}
if (state.PacketsTodo > 0)
{
state.Message.Append(Helpers.Bytes2String(state.Buffer, 12, bytesRead - 12));
state.PacketsTodo--;
}
if (state.PacketsTodo == 0)
{
OnBattlEyeMessage(state.Message.ToString(), state.Buffer[8]);
state.Message = new StringBuilder();
state.PacketsTodo = 0;
}
}
else
{
// Temporary fix to avoid infinite loops with multi-packet server messages
state.Message = new StringBuilder();
state.PacketsTodo = 0;
OnBattlEyeMessage(Helpers.Bytes2String(state.Buffer, 9, bytesRead - 9), state.Buffer[8]);
}
}
if (packetQueue.ContainsKey(state.Buffer[8]) && state.PacketsTodo == 0)
{
packetQueue.Remove(state.Buffer[8]);
}
}
packetReceived = DateTime.Now;
client.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
}
catch
{
// do nothing
}
}