private void DoReceiveFrom(IAsyncResult iar) { //Get the received message. Socket recvSock = (Socket)iar.AsyncState; EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0); int msgLen = recvSock.EndReceiveFrom(iar, ref clientEP); byte[] localMsg = new byte[msgLen]; Array.Copy(buffer, localMsg, msgLen); //Start listening for a new message. EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0); udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock); // Found our client if (origin == null || (origin.Port != ((IPEndPoint)clientEP).Port) && ((IPEndPoint)clientEP).Address.Equals(origin.Address)) { if (origin != null) { Console.WriteLine("[Info] Found new client, did the old one get disconnected?"); } else { Console.WriteLine("[Info] Found new client"); } origin = (IPEndPoint)clientEP; } // Message is C -> S if (((IPEndPoint)clientEP).Address.Equals(origin.Address)) { udpSock.SendTo(localMsg, destination); } // Message is S -> C else { switch (localMsg[1]) { case 2: // SOE_SESSION_REPLY byte[] crcSeed = new byte[4]; Array.Copy(localMsg, 6, crcSeed, 0, 4); Program.session = new Session(crcSeed); break; case 9: // SOE_CHL_DATA_A SOEPacket packet = new SOEPacket(localMsg); Console.WriteLine("[Debug] Packet " + (localMsg.SequenceEqual(packet.ToArray()) ? "succesfully" : "unsuccessfully") + " rebuilt"); localMsg = packet.ToArray(); break; default: Console.WriteLine("[Debug] Unknown SOE opcode: {0}", localMsg[1]); break; } udpSock.SendTo(localMsg, origin); } }