Example #1
0
        /// <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);
        }
Example #2
0
        /// <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);
        }