/// <summary> /// Read callback for the receiving socket /// </summary> /// <param name="ar">Ar.</param> private void OnRead(IAsyncResult ar) { EndPoint fromEndpoint = new IPEndPoint(IPAddress.Any, 0); int length = 0; try { length = socket.EndReceiveFrom(ar, ref fromEndpoint); } catch (ObjectDisposedException) { return; } byte[] data = new byte[length]; System.Buffer.BlockCopy(buffer.data, 0, data, 0, length); BeginRead(); // start reading for more packets BitReader r = new BitReader(data, length); bool isUdp = r.ReadBool(); if (!isUdp) { return; // only accept udp packets } byte id = r.ReadUInt8(); var packet = Udp.CreateUdpPacket(id); if (packet == null) { return; // failed to create a packet from the given id value } packet.ReadPacket(r); HandlePacket(packet, fromEndpoint); }
/// <summary> /// Packet data received /// </summary> /// <param name="length"></param> protected void ReceivedData(byte[] data, int length) { BitReader r = new BitReader(data, length); bool isUdp = r.ReadBool(); byte id; if (isUdp) { id = r.ReadUInt8(); var udpPacket = Udp.CreateUdpPacket(id); if (udpPacket == null) { return; } udpPacket.ReadPacket(r); HandleUdpPacket(udpPacket); return; } ulong receivedSalt = r.ReadUInt64(); if (receivedSalt != salt) { return; // salt mismatch, TODO disconnect } #if DEBUG if (Rand.Next(10000) / 100.0 < Simulate_Packet_Loss_Percent) { Log.Error("Stopped packet: " + r.ReadUInt16()); return; } #endif lastReceived = DateTime.Now; id = r.ReadUInt8(); // read packet type var channel = channels[id]; // get channel for packet type channel.ReceivePacket(r, id); }