Ejemplo n.º 1
0
        static void Main(string[] args)
        {
            Console.WriteLine("Server Started");
            
            Dictionary<IPEndPoint, AvailableGame> registeredHosts = new Dictionary<IPEndPoint, AvailableGame>();

            NetPeerConfiguration config = new NetPeerConfiguration("masterserver");
            config.SetMessageTypeEnabled(NetIncomingMessageType.UnconnectedData, true);
            config.Port = 6000;

            NetPeer peer = new NetPeer(config);
            peer.Start();

            // keep going until ESCAPE is pressed
            Console.WriteLine("Press ESC to quit");
            while (!Console.KeyAvailable || Console.ReadKey().Key != ConsoleKey.Escape)
            {
                System.Threading.Thread.Sleep(10);
                NetIncomingMessage msg;
                while ((msg = peer.ReadMessage()) != null)
                {
                    switch (msg.MessageType)
                    {
                        case NetIncomingMessageType.UnconnectedData:
                            //
                            // We've received a message from a client or a host
                            //

                            // by design, the first byte always indicates action
                            switch (msg.ReadByte())
                            {
                                case 0: // register a new game
                                    // currently only one game per host per router.
                                    if (!registeredHosts.ContainsKey(msg.SenderEndpoint))
                                    {
                                        AvailableGame game = new AvailableGame();
                                        game.Count = msg.ReadInt32();
                                        game.GamerTag = msg.ReadString();
                                        game.PrivateGamerSlots = msg.ReadInt32();
                                        game.MaxGamers = msg.ReadInt32();
                                        game.IsHost = msg.ReadBoolean();
                                        game.InternalIP = msg.ReadIPEndpoint();
                                        game.ExternalIP = msg.SenderEndpoint;
                                        game.Game = msg.ReadString();


                                        Console.WriteLine("Got registration for host " + game.ToString());
                                        registeredHosts.Add(game.ExternalIP, game);
                                    }
                                    break;

                                case 1:
                                    // It's a client wanting a list of registered hosts
                                    Console.WriteLine("Sending list of " + registeredHosts.Count + " hosts to client " + msg.SenderEndpoint);
                                    string appid = msg.ReadString();
                                    foreach (AvailableGame g1 in registeredHosts.Values)
                                    {
                                        if (g1.Game == appid)
                                        {
                                            // send registered host to client
                                            NetOutgoingMessage om = peer.CreateMessage();
                                            om.Write(g1.Count);
                                            om.Write(g1.GamerTag);
                                            om.Write(g1.PrivateGamerSlots);
                                            om.Write(g1.MaxGamers);
                                            om.Write(g1.IsHost);
                                            om.Write(g1.InternalIP);
                                            om.Write(g1.ExternalIP);
                                            peer.SendUnconnectedMessage(om, msg.SenderEndpoint);
                                        }
                                    }

                                    break;
                                case 2:
                                    // It's a client wanting to connect to a specific (external) host
                                    IPEndPoint clientInternal = msg.ReadIPEndpoint();
                                    IPEndPoint hostExternal = msg.ReadIPEndpoint();
                                    string token = msg.ReadString();

                                    Console.WriteLine(msg.SenderEndpoint + " requesting introduction to " + hostExternal + " (token " + token + ")");

                                    // find in list
                                    foreach (AvailableGame elist in registeredHosts.Values)
                                    {
                                        if (elist.ExternalIP.Equals(hostExternal))
                                        {
                                            // found in list - introduce client and host to eachother
                                            Console.WriteLine("Sending introduction...");
                                            peer.Introduce(
                                                    elist.InternalIP, // host internal
                                                    elist.ExternalIP, // host external
                                                    clientInternal, // client internal
                                                    msg.SenderEndpoint, // client external
                                                    token // request token
                                            );
                                            break;
                                        }
                                    }
                                    break;
                                case 3:
                                    if (registeredHosts.ContainsKey(msg.SenderEndpoint))
                                    {
                                        AvailableGame game = registeredHosts[msg.SenderEndpoint];
                                        string tag = msg.ReadString();
                                        string gamename = msg.ReadString();
                                        if (game.GamerTag == tag)
                                        {
                                            Console.WriteLine("Remove for host " + game.ExternalIP.ToString());
                                            registeredHosts.Remove(game.ExternalIP);
                                        }
                                    }
                                    break;
                                case 4 :
                                    if (registeredHosts.ContainsKey(msg.SenderEndpoint))
                                    {
                                        AvailableGame game = registeredHosts[msg.SenderEndpoint];
                                        int count = msg.ReadInt32();
                                        string tag = msg.ReadString();                                        
                                        if (game.GamerTag == tag)
                                        {
                                            Console.WriteLine("Update for host " + game.ExternalIP.ToString());                                            
                                            game.Count = count;
	                                        game.PrivateGamerSlots = msg.ReadInt32();
	                                        game.MaxGamers = msg.ReadInt32();
	                                        game.IsHost = msg.ReadBoolean();
	                                        game.InternalIP = msg.ReadIPEndpoint();
	                                        game.Game = msg.ReadString();
                                        }
                                    }
                                    break;
                            }
                            break;

                        case NetIncomingMessageType.DebugMessage:
                        case NetIncomingMessageType.VerboseDebugMessage:
                        case NetIncomingMessageType.WarningMessage:
                        case NetIncomingMessageType.ErrorMessage:
                            // print diagnostics message
                            Console.WriteLine(msg.ReadString());
                            break;
                    }
                }
            }

            peer.Shutdown("shutting down");

        }
Ejemplo n.º 2
0
        static void Main(string[] args)
        {
            Console.WriteLine("Server Started");

            Dictionary <IPEndPoint, AvailableGame> registeredHosts = new Dictionary <IPEndPoint, AvailableGame>();

            NetPeerConfiguration config = new NetPeerConfiguration("masterserver");

            config.SetMessageTypeEnabled(NetIncomingMessageType.UnconnectedData, true);
            config.Port = 6000;

            NetPeer peer = new NetPeer(config);

            peer.Start();

            // keep going until ESCAPE is pressed
            Console.WriteLine("Press ESC to quit");
            while (!Console.KeyAvailable || Console.ReadKey().Key != ConsoleKey.Escape)
            {
                System.Threading.Thread.Sleep(10);
                NetIncomingMessage msg;
                while ((msg = peer.ReadMessage()) != null)
                {
                    switch (msg.MessageType)
                    {
                    case NetIncomingMessageType.UnconnectedData:
                        //
                        // We've received a message from a client or a host
                        //

                        // by design, the first byte always indicates action
                        switch (msg.ReadByte())
                        {
                        case 0:         // register a new game
                            // currently only one game per host per router.
                            if (!registeredHosts.ContainsKey(msg.SenderEndpoint))
                            {
                                AvailableGame game = new AvailableGame();
                                game.Count             = msg.ReadInt32();
                                game.GamerTag          = msg.ReadString();
                                game.PrivateGamerSlots = msg.ReadInt32();
                                game.MaxGamers         = msg.ReadInt32();
                                game.IsHost            = msg.ReadBoolean();
                                game.InternalIP        = msg.ReadIPEndpoint();
                                game.ExternalIP        = msg.SenderEndpoint;
                                game.Game = msg.ReadString();


                                Console.WriteLine("Got registration for host " + game.ToString());
                                registeredHosts.Add(game.ExternalIP, game);
                            }
                            break;

                        case 1:
                            // It's a client wanting a list of registered hosts
                            Console.WriteLine("Sending list of " + registeredHosts.Count + " hosts to client " + msg.SenderEndpoint);
                            string appid = msg.ReadString();
                            foreach (AvailableGame g1 in registeredHosts.Values)
                            {
                                if (g1.Game == appid)
                                {
                                    // send registered host to client
                                    NetOutgoingMessage om = peer.CreateMessage();
                                    om.Write(g1.Count);
                                    om.Write(g1.GamerTag);
                                    om.Write(g1.PrivateGamerSlots);
                                    om.Write(g1.MaxGamers);
                                    om.Write(g1.IsHost);
                                    om.Write(g1.InternalIP);
                                    om.Write(g1.ExternalIP);
                                    peer.SendUnconnectedMessage(om, msg.SenderEndpoint);
                                }
                            }

                            break;

                        case 2:
                            // It's a client wanting to connect to a specific (external) host
                            IPEndPoint clientInternal = msg.ReadIPEndpoint();
                            IPEndPoint hostExternal   = msg.ReadIPEndpoint();
                            string     token          = msg.ReadString();

                            Console.WriteLine(msg.SenderEndpoint + " requesting introduction to " + hostExternal + " (token " + token + ")");

                            // find in list
                            foreach (AvailableGame elist in registeredHosts.Values)
                            {
                                if (elist.ExternalIP.Equals(hostExternal))
                                {
                                    // found in list - introduce client and host to eachother
                                    Console.WriteLine("Sending introduction...");
                                    peer.Introduce(
                                        elist.InternalIP,   // host internal
                                        elist.ExternalIP,   // host external
                                        clientInternal,     // client internal
                                        msg.SenderEndpoint, // client external
                                        token               // request token
                                        );
                                    break;
                                }
                            }
                            break;

                        case 3:
                            if (registeredHosts.ContainsKey(msg.SenderEndpoint))
                            {
                                AvailableGame game     = registeredHosts[msg.SenderEndpoint];
                                string        tag      = msg.ReadString();
                                string        gamename = msg.ReadString();
                                if (game.GamerTag == tag)
                                {
                                    Console.WriteLine("Remove for host " + game.ExternalIP.ToString());
                                    registeredHosts.Remove(game.ExternalIP);
                                }
                            }
                            break;

                        case 4:
                            if (registeredHosts.ContainsKey(msg.SenderEndpoint))
                            {
                                AvailableGame game  = registeredHosts[msg.SenderEndpoint];
                                int           count = msg.ReadInt32();
                                string        tag   = msg.ReadString();
                                if (game.GamerTag == tag)
                                {
                                    Console.WriteLine("Update for host " + game.ExternalIP.ToString());
                                    game.Count             = count;
                                    game.PrivateGamerSlots = msg.ReadInt32();
                                    game.MaxGamers         = msg.ReadInt32();
                                    game.IsHost            = msg.ReadBoolean();
                                    game.InternalIP        = msg.ReadIPEndpoint();
                                    game.Game = msg.ReadString();
                                }
                            }
                            break;
                        }
                        break;

                    case NetIncomingMessageType.DebugMessage:
                    case NetIncomingMessageType.VerboseDebugMessage:
                    case NetIncomingMessageType.WarningMessage:
                    case NetIncomingMessageType.ErrorMessage:
                        // print diagnostics message
                        Console.WriteLine(msg.ReadString());
                        break;
                    }
                }
            }

            peer.Shutdown("shutting down");
        }