コード例 #1
0
        /// <summary>
        /// Sends discovery packets to all servers on the local network
        /// </summary>
        public void DiscoverServers()
        {
            // Discover local peers :D
            myPeer.DiscoverLocalPeers(NetSettings.DEFAULT_SERVER_PORT);
            myPeer.DiscoverLocalPeers(NetSettings.DEFAULT_SERVER_PORT + 1);
            myPeer.DiscoverLocalPeers(NetSettings.DEFAULT_SERVER_PORT + 2);
            myPeer.DiscoverLocalPeers(NetSettings.DEFAULT_SERVER_PORT + 3);

            try
            {
                // Get the IP range to ping
                IPSegment segment = new IPSegment(NetUtils.GetGateway(myAddress).ToString(), NetUtils.GetSubnetMask(myAddress).ToString());

                // Get an enumerable result
                IEnumerable <uint> hosts = segment.Hosts();

                // Iterate and ping each one
                foreach (uint host in hosts)
                {
                    myPeer.DiscoverKnownPeer(host.ToIpString(), NetSettings.DEFAULT_SERVER_PORT);
                }
            }
            catch (Exception e)
            {
                Logger.Write("Failed to ping local servers");
                MessageBox.Show("Failed to discover local servers, please make sure you don't have any weird networking", "Whoops", MessageBoxButtons.OK);
            }
        }
コード例 #2
0
ファイル: OnlineStuff.cs プロジェクト: Fusionnist/Flipswitch
 public void Update(float a_es)
 {
     if (connecting)
     {
         peer.DiscoverKnownPeer(ipId.ips[0], 8000);
     }
     HandleWebConnections();
 }
コード例 #3
0
 public static void DiscoverPeer(NetPeer peer, string adr, short port)
 {
     try
     {
         peer.DiscoverKnownPeer(new IPEndPoint(NetUtility.Resolve(adr), port));
     }
     catch (NetException nex)
     {
         if (nex.Message != "This message has already been sent! Use NetPeer.SendMessage() to send to multiple recipients efficiently")
         {
             throw;
         }
     }
 }
コード例 #4
0
        private void waitForMessages()
        {
            while (peerOn)
            {
                if (DateTime.Now > nextPingTime)
                {
                    for (int i = 0; i < availablePeers.Count; i++) //foreach (peerType p in availablePeers)
                    {
                        peerType           p    = availablePeers[i];
                        NetOutgoingMessage ping = peer.CreateMessage();
                        ping.Write((short)SentDataType.ping);
                        peer.SendUnconnectedMessage(ping, p.address);
                    }
                    lastPingTime = DateTime.Now;
                    nextPingTime = lastPingTime.AddSeconds(1);
                }

                for (int i = 0; i < availablePeers.Count; i++) //foreach (peerType p in availablePeers)
                {
                    peerType p = availablePeers[i];
                    if (p.lastPing < DateTime.Now.AddSeconds(-2))
                    {
                        availablePeers.Remove(p);
                        PlayerRemoved(p, EventArgs.Empty);
                    }
                }

                NetIncomingMessage msg;
                while ((msg = peer.ReadMessage()) != null)
                {
                    switch (msg.MessageType)
                    {
                    case NetIncomingMessageType.VerboseDebugMessage:
                    case NetIncomingMessageType.DebugMessage:
                    case NetIncomingMessageType.WarningMessage:
                    case NetIncomingMessageType.ErrorMessage:
                        Console.WriteLine(msg.ReadString());
                        break;

                    case NetIncomingMessageType.StatusChanged:
                        // In case status changed
                        // It can be one of these
                        // NetConnectionStatus.Connected;
                        // NetConnectionStatus.Connecting;
                        // NetConnectionStatus.Disconnected;
                        // NetConnectionStatus.Disconnecting;
                        // NetConnectionStatus.None;

                        // NOTE: Disconnecting and Disconnected are not instant unless client is shutdown with disconnect()
                        Console.WriteLine(msg.SenderConnection.ToString() + " status changed. " + (NetConnectionStatus)msg.SenderConnection.Status);

                        if (msg.SenderConnection.Status == NetConnectionStatus.Connected)
                        {
                            if (Connected != null)
                            {
                                foreach (peerType p in availablePeers)
                                {
                                    if (p.address.Equals(peer.Connections[0].RemoteEndPoint))
                                    {
                                        clientName = p.name;
                                    }
                                }
                                Connected(msg, EventArgs.Empty);
                            }
                        }

                        if (msg.SenderConnection.Status == NetConnectionStatus.Disconnected)
                        {
                            if (Disconnected != null)
                            {
                                Disconnected(msg, EventArgs.Empty);
                            }
                        }
                        break;

                    case NetIncomingMessageType.ConnectionApproval:
                        msg.SenderConnection.Approve();
                        iAmPlayer1 = false;
                        break;

                    case NetIncomingMessageType.DiscoveryRequest:
                        #region old stuff
                        //NetOutgoingMessage resp = peer.CreateMessage();
                        //resp.Write(peerName);
                        //resp.Write(GAME_NAME);
                        //peer.SendDiscoveryResponse(resp, msg.SenderEndPoint);

                        //System.Net.IPAddress myAddress;
                        //System.Net.IPAddress myAddressMask;
                        //myAddress = NetUtility.GetMyAddress(out myAddressMask);

                        //bool same = msg.SenderEndPoint.Address.Equals(myAddress);
                        //if (!same)
                        //{
                        //    bool discoverSender = true;
                        //    foreach (peerType p in availablePeers)
                        //    {
                        //        if (p.address.Equals(msg.SenderEndPoint.Address))
                        //        {
                        //            discoverSender = false;
                        //            break;
                        //        }
                        //    }
                        //    if (discoverSender)
                        //    {
                        //        peer.DiscoverKnownPeer(msg.SenderEndPoint);
                        //    }
                        //}
                        #endregion
                        Console.WriteLine("Type = DiscoveryRequest; Sender = " + msg.SenderEndPoint.ToString());

                        getPeerId(msg.SenderEndPoint);

                        if (!listContainsIPEndPoint(msg.SenderEndPoint) && msg.SenderEndPoint != myIPEndPoint)
                        {
                            peer.DiscoverKnownPeer(msg.SenderEndPoint);
                        }

                        break;

                    case NetIncomingMessageType.DiscoveryResponse:
                        Console.WriteLine("Type = DiscoveryResponse; Sender = " + msg.SenderEndPoint);

                        string foundPeerName = msg.ReadString();
                        string foundGameName = msg.ReadString();
                        Console.WriteLine(foundPeerName);
                        Console.WriteLine(foundGameName);
                        addPeerToList(foundPeerName, foundGameName, msg.SenderEndPoint);
                        Console.WriteLine("Available Peers:");
                        foreach (peerType p in availablePeers)
                        {
                            Console.WriteLine(p.name);
                        }
                        // Raise event causing lobby list to be updated.
                        if (Discovered != null)
                        {
                            Discovered(msg, EventArgs.Empty);
                        }
                        break;

                    case NetIncomingMessageType.Data:
                        #region Data
                        //Console.ForegroundColor = ConsoleColor.Cyan;
                        //Console.WriteLine(msg.ReadString());
                        //Console.ResetColor();

                        short type = msg.ReadInt16();

                        //Console.WriteLine("Type = Data; Subtype = " + type + " Sender = " + msg.SenderEndPoint);

                        if (type == (short)SentDataType.move)
                        {
                            Console.WriteLine("Type = move; Sender = " + msg.SenderEndPoint);

                            moveType move = new moveType();
                            move.quad        = msg.ReadInt16();
                            move.position    = msg.ReadInt16();
                            move.isClockwise = msg.ReadBoolean();
                            if (MoveReceived != null)
                            {
                                MoveReceived(move, EventArgs.Empty);
                            }
                        }
                        else if (type == (short)SentDataType.globalChat)
                        {
                            string message = msg.ReadString();
                        }
                        else if (type == (short)SentDataType.privateChat)
                        {
                            string message = msg.ReadString();
                        }
                        else if (type == (short)SentDataType.idRequest)
                        {
                            Console.WriteLine("Type = idRequest; Sender = " + msg.SenderEndPoint);

                            sendId(msg.SenderEndPoint);
                        }
                        else if (type == (short)SentDataType.idResponse)
                        {
                            Console.WriteLine("Type = idResponse; Sender = " + msg.SenderEndPoint);

                            otherId = msg.ReadInt32();

                            // Discovery Response
                            if (otherId != myId)
                            {
                                NetOutgoingMessage resp = peer.CreateMessage();
                                resp.Write(peerName);
                                resp.Write(GAME_NAME);
                                peer.SendDiscoveryResponse(resp, msg.SenderEndPoint);
                            }
                            else
                            {
                                myIPEndPoint = msg.SenderEndPoint;
                            }
                        }
                        break;
                        #endregion

                    case NetIncomingMessageType.UnconnectedData:
                        #region Unconnected Data
                        type = msg.ReadInt16();

                        if (type == (short)SentDataType.move)
                        {
                            Console.WriteLine("Type = move; Sender = " + msg.SenderEndPoint);

                            short quadrant    = msg.ReadInt16();
                            short position    = msg.ReadInt16();
                            bool  isClockwise = msg.ReadBoolean();
                        }
                        else if (type == (short)SentDataType.globalChat)
                        {
                            string message = msg.ReadString();
                        }
                        else if (type == (short)SentDataType.privateChat)
                        {
                            string message = msg.ReadString();
                        }
                        else if (type == (short)SentDataType.idRequest)
                        {
                            Console.WriteLine("Type = idRequest; Sender = " + msg.SenderEndPoint);

                            sendId(msg.SenderEndPoint);
                        }
                        else if (type == (short)SentDataType.idResponse)
                        {
                            Console.WriteLine("Type = idResponse; Sender = " + msg.SenderEndPoint);

                            otherId = msg.ReadInt32();

                            // Discovery Response
                            if (otherId != myId)
                            {
                                NetOutgoingMessage resp = peer.CreateMessage();
                                resp.Write(peerName);
                                resp.Write(GAME_NAME);
                                peer.SendDiscoveryResponse(resp, msg.SenderEndPoint);
                            }
                            else
                            {
                                myIPEndPoint = msg.SenderEndPoint;
                            }
                        }
                        else if (type == (short)SentDataType.connectRequest)
                        {
                            // Raise event causing user to get connection request
                            if (ConnectionRequest != null)
                            {
                                pendingConnectRequester = msg.SenderEndPoint;
                                ConnectionRequest(msg.ReadString(), EventArgs.Empty);
                            }
                        }
                        else if (type == (short)SentDataType.ping)
                        {
                            if (peer.Connections.Count == 0)
                            {
                                NetOutgoingMessage resp = peer.CreateMessage();
                                resp.Write((short)SentDataType.pingResponse);
                                peer.SendUnconnectedMessage(resp, msg.SenderEndPoint);
                            }
                        }
                        else if (type == (short)SentDataType.pingResponse)
                        {
                            foreach (peerType p in availablePeers)
                            {
                                if (p.address == msg.SenderEndPoint)
                                {
                                    p.lastPing = DateTime.Now;
                                }
                            }
                        }
                        break;
                        #endregion

                    default:
                        Console.WriteLine("Unhandled type: " + msg.MessageType);
                        break;
                    }
                    peer.Recycle(msg);
                }
            }
        }
コード例 #5
0
 public void sendDiscoveryRequest(IPEndPoint end)
 {
     peer.DiscoverKnownPeer(end);
 }