Beispiel #1
0
        /// <summary>
        /// Serve the current UDP client
        /// </summary>
        async Task ServeClient(UdpReceiveResult result)
        {
            try {
                byte[]     receivedBytes      = result.Buffer;
                IPEndPoint receivedIpEndPoint = result.RemoteEndPoint;

                MemoryStream stream = new MemoryStream(receivedBytes);
                stream.Position = 0;
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Host));
                Host received = (Host)ser.ReadObject(stream);

                // Check if the remote user is not us
                if (_referenceData.GetListIps().Contains(receivedIpEndPoint.Address.ToString()))
                {
                    return;
                }

                // Update network information if needed
                if (_referenceData.UpdateNetworkConfiguration(receivedIpEndPoint.Address.ToString()))
                {
                    if (!_referenceData.isFirst)
                    {
                        await MainWindow.main.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => {
                            MainWindow.main.StopTCPListener();
                        }));
                    }
                    else
                    {
                        _referenceData.isFirst = false;
                    }

                    // Pulse monitor to advise the TCPlistener to start
                    lock (_referenceData.cvListener) {
                        Monitor.Pulse(_referenceData.cvListener);
                    }
                }

                // Update user data if needed
                if (_referenceData.UpdateUsersInfo(received, receivedIpEndPoint.Address.ToString()))
                {
                    string ip = receivedIpEndPoint.Address.ToString();
                    await MainWindow.main.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => {
                        MainWindow.main.UpdateProfileHost(ip);
                        MainWindow.main.UpdateHostName(ip, received.Name);
                        MainWindow.main.SendProfileImage();
                    }));
                }
            }
            catch (AggregateException ae) {
                Console.WriteLine($"{DateTime.Now.ToString()}\t - UDPListener AggregateException: {ae.Message}");
                lock (_referenceData.cvListener) {
                    Monitor.Pulse(_referenceData.cvListener);
                }
            }
            catch (SerializationException se) {
                Console.WriteLine($"{DateTime.Now.ToString()}\t - UDPListener SerializationException - UDP Packet is in the wrong format: {se.Message}");
                lock (_referenceData.cvListener) {
                    Monitor.Pulse(_referenceData.cvListener);
                }
            }
            catch (Exception se) {
                Console.WriteLine($"{DateTime.Now.ToString()}\t - UDPListener Exception - {se.Message}");
                lock (_referenceData.cvListener) {
                    Monitor.Pulse(_referenceData.cvListener);
                }
            }
        }