private void ReceiveData(IAsyncResult ar) { var state = (StateObject)ar.AsyncState; var receive = 0; this.LastData = DateTime.UtcNow; try { receive = this.MainSocket.EndReceive(ar); } catch { } if (receive > 0) { state.Data.Append(state.Buffer); state.Received += receive; var temp = new DataBuffer(); temp.FromArray(state.Data.ToArray()); var alength = temp.ReadInt32(); if ((state.Received - 4) >= alength) { var work = true; while (work) { var calc = new DataBuffer(); calc.FromArray(state.Data.ToArray()); var length = calc.ReadInt32(); if (state.Data.Length() - 4 >= length) { var buffer = new DataBuffer(); buffer.FromArray(state.Data.ToArray().Skip(4).Take(length).ToArray()); var data = state.Data.ToArray().Skip(4 + length).Take(state.Received - (4 + length)).ToArray(); state.Data.FromArray(data); state.Buffer = data; this.PacketHandler(buffer); } else { var newstate = new StateObject(); this.MainSocket.BeginReceive(newstate.Buffer, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveData), newstate); work = false; } } } else { this.MainSocket.BeginReceive(state.Buffer, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveData), state); } } }