/// <summary> Processes incoming UDP packet, then starts the listener again. </summary> private static void HandleUDPData(IAsyncResult Result) { UdpClient Listener; IPEndPoint ReceivedEndpoint; byte[] Data; string ClientName; try { Listener = (UdpClient)Result.AsyncState; ReceivedEndpoint = new IPEndPoint(IPAddress.Any, 0); Data = Listener.EndReceive(Result, ref ReceivedEndpoint); ClientName = FindClient(ReceivedEndpoint, true); } catch (Exception Exc) { Log.Output(Log.Severity.WARNING, Log.Source.NETWORK, "Failed to receive UDP data."); Log.Exception(Log.Source.NETWORK, Exc); return; } if (Data.Length == 0) // TODO: Can this happen? { Log.Output(Log.Severity.INFO, Log.Source.NETWORK, "Client has disconnected."); if (ClientName != null) { lock (Clients[ClientName]) { Clients[ClientName].Connected = false; } } } else { if (ClientName == null) // New client { try { ClientName = UtilData.ToString(Data); } catch { } if (ClientName != null && ClientName.Length > 0) { Log.Output(Log.Severity.INFO, Log.Source.NETWORK, "UDP Client connected with name \"" + ClientName + "\"."); lock (Clients) { if (Clients.ContainsKey(ClientName)) { Clients[ClientName].EndpointUDP = ReceivedEndpoint; Clients[ClientName].Connected = true; } else { ScarletClient NewClient = new ScarletClient() { EndpointUDP = ReceivedEndpoint, Name = ClientName, Connected = true }; Clients.Add(ClientName, NewClient); } } // Create buffer for the client CreateBufferIfClientIsNew(ClientName); } else { Log.Output(Log.Severity.WARNING, Log.Source.NETWORK, "UDP Client sent invalid name upon connecting."); } } else // Existing client { Packet ReceivedPack = new Packet(new Message(Data), false, ClientName); ReceiveQueue.Enqueue(ReceivedPack); if (StorePackets) { PacketsReceived.Add(ReceivedPack); } } } Listener.BeginReceive(HandleUDPData, Listener); }
/// <summary> /// Begin receiving data on the Loopback ip with a specified port. /// </summary> /// <param name="port">The port to listen for data on.</param> void BeginReceive(int port) { IpEndpoint = new IPEndPoint(IPAddress.Loopback, port); Listener.BeginReceive((ReceiveCallback), Listener); }