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); } } }
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; }