void ReceiveCallback(IAsyncResult ar) { bool recsuccess = false; RecState state = null; try { int bytesgotten = S.EndReceive(ar); state = (RecState)ar.AsyncState; state.BytesSoFar += bytesgotten; recsuccess = true; #if DEBUG Trace.WriteLine(String.Format("Receive Callback. Packet: {0} First packet: {1}, Bytes so far: {2}", state.PacketCount, state.IsPacketLength, state.BytesSoFar)); #endif } catch (SocketException) { OnError(ConnectionClosed); } if (recsuccess) { ProcessIncomingData(state); } }
void StartGetNewPacket() { RecState state = new RecState(); state.IsPacketLength = true; state.Data = new byte[4]; state.PacketCount = PacketCount; PacketCount++; #if DEBUG TempPackets.Add(state); #endif S.BeginReceive(state.Data, 0, 4, SocketFlags.None, new AsyncCallback(ReceiveCallback), state); }
void ProcessIncomingData(RecState state) { if (state.IsPacketLength) { // First 4 bytes of a new packet. state.PacketLength = BitConverter.ToInt32(state.Data, 0); state.IsPacketLength = false; state.BytesSoFar = 0; state.Data = new byte[state.PacketLength]; S.BeginReceive(state.Data, 0, state.PacketLength, SocketFlags.None, new AsyncCallback(ReceiveCallback), state); } else { // Do something with data... if (state.BytesSoFar < state.PacketLength) { // Missing data. S.BeginReceive(state.Data, state.BytesSoFar, state.PacketLength - state.BytesSoFar, SocketFlags.None, new AsyncCallback(ReceiveCallback), state); } else { // Process data. #if DEBUG Trace.WriteLine("Complete packet."); #endif RCONPacket RetPack = new RCONPacket(); RetPack.ParseFromBytes(state.Data, this); ProcessResponse(RetPack); // Wait for new packet. StartGetNewPacket(); } } }