Exemplo n.º 1
0
        public bool Ping()
        {
            var commands = new[] { new EmptyPacketCommand()
                                   {
                                       Command = CommandType.Ping
                                   } };

            var packet = new ScoreboardPacket {
                Commands = commands
            };

            using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
            {
                ReceiveTimeout = 1000
            })
            {
                try
                {
                    socket.Connect(this.EndPoint);

                    socket.Send(packet.ToBytes());

                    var buffer = new byte[100];
                    socket.Receive(buffer);

                    var incoming = ScoreboardPacket.Parse(buffer);
                    return(incoming.Commands[0].Command == CommandType.Pong);
                }
                catch (Exception)
                {
                    // If anything fails, return false.
                    return(false);
                }
            }
        }
Exemplo n.º 2
0
        public void Listen(SettingsPanelViewModel sb)
        {
            if (this.listenThread != null)
            {
                if (this.listenThread.IsAlive)
                {
                    this.StopListen = true;

                    while (this.listenThread.IsAlive)
                    {
                        Thread.Sleep(20);
                    }
                }
            }

            this.StopListen = false;

            IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
            var         endPoints = new List <IPEndPoint>();

            foreach (var entry in hostEntry.AddressList)
            {
                if (entry.AddressFamily == AddressFamily.InterNetwork)
                {
                    endPoints.Add(new IPEndPoint(entry, this.PortNumber));
                    break;
                }
            }

            if (endPoints.Count == 0)
            {
                MessageBox.Show("No valid networks were found to connect to.");
                return;
            }

            var socket = new Socket(endPoints[0].Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp)
            {
                ReceiveTimeout = 5000
            };

            foreach (var e in endPoints)
            {
                socket.Bind(e);
            }

            this.listenThread = new Thread(
                new ThreadStart(
                    delegate
            {
                while (this.StopListen == false)
                {
                    var inBuffer          = new byte[1000];
                    EndPoint senderRemote = new IPEndPoint(IPAddress.Any, 0);

                    try
                    {
                        socket.ReceiveFrom(inBuffer, ref senderRemote);
                    }
                    catch (SocketException ex)
                    {
                        int errorCode = ex.ErrorCode;
                        continue;
                    }

                    var packet = ScoreboardPacket.Parse(inBuffer);

                    foreach (var cmd in packet.Commands)
                    {
                        if (cmd.Command == CommandType.Ping)
                        {
                            var pongCmd = new EmptyPacketCommand {
                                Command = CommandType.Pong
                            };
                            var pongPacket = new ScoreboardPacket()
                            {
                                Commands = new[] { pongCmd }
                            };

                            socket.SendTo(pongPacket.ToBytes(), senderRemote);
                        }
                    }

                    this.dispatcher.BeginInvoke((Action)(() => sb.HandleRemoteCommands(packet, socket, senderRemote)));
                }

                socket.Close();
                socket.Dispose();
            }));

            this.listenThread.Start();
            this.IsListening = true;
        }