コード例 #1
0
        public static void ServerLoop()
        {
            Main.players[255].whoAmi = 255;
            NetPlay.serverIP         = IPAddress.Parse(serverSIP);
            NetPlay.serverListenIP   = NetPlay.serverIP;
            NetPlay.disconnect       = false;

            //			for (int i = 0; i < 256; i++)
            //			{
            ////                Netplay.slots[i] = new ServerSlot();
            //                Netplay.slots[i].whoAmI = i;
            //				Netplay.slots[i].Reset();
            //			}
            Init();

            NetPlay.tcpListener = new TcpListener(NetPlay.serverListenIP, NetPlay.serverPort);

            try
            {
                NetPlay.tcpListener.Start();
            }
            catch (Exception exception)
            {
                ProgramLog.Error.Log("Error Starting the Server: {0}", exception);
                NetPlay.disconnect = true;
            }

            if (!NetPlay.disconnect)
            {
                if (!Program.updateThread.IsAlive)
                {
                    Program.updateThread.Start();
                }
                ProgramLog.Admin.Log("{0} {1}:{2}", Language.Languages.ServerStartedOn, serverSIP, serverPort);
                //                ProgramLog.Log("Loading Plugins...");
                //				PluginManager.LoadAllPlugins();
                //                ProgramLog.Log("Plugins Loaded: " + PluginManager.Plugins.Count.ToString());
                //Statics.serverStarted = true;
            }
            else
            {
                return;
            }

            SlotManager.Initialize(Program.properties.MaxPlayers, Program.properties.OverlimitSlots);

            ServerUp = true;
            var serverSock = NetPlay.tcpListener.Server;

            try
            {
                while (!NetPlay.disconnect)
                {
                    NetPlay.anyClients = Networking.ClientConnection.All.Count > 0;                     //clientList.Count > 0;

                    serverSock.Poll(500000, SelectMode.SelectRead);

                    if (NetPlay.disconnect)
                    {
                        break;
                    }

                    // Accept new clients
                    while (NetPlay.tcpListener.Pending())
                    {
                        var client   = NetPlay.tcpListener.AcceptSocket();
                        var accepted = AcceptClient(client);
                        if (accepted)
                        {
                            NetPlay.anyClients = true;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                ProgramLog.Log(e, "ServerLoop terminated with exception");
            }

            NetPlay.anyClients = false;

            try
            {
                tcpListener.Stop();
            }
            catch (SocketException) { }



            lock (Networking.ClientConnection.All)
            {
                var conns = Networking.ClientConnection.All.ToArray();

                foreach (var conn in conns)
                {
                    conn.Kick("Server is shutting down.");
                }
            }

            for (int i = 0; i < 255; i++)
            {
                try
                {
                    slots[i].Kick("Server is shutting down.");
                }
                catch { }
            }

            Thread.Sleep(1000);

            for (int i = 0; i < 255; i++)
            {
                try
                {
                    slots[i].Reset();
                }
                catch { }
            }

            if (!WorldIO.SaveWorld(World.SavePath, true))
            {
                ProgramLog.Error.Log("Saving failed.  Quitting without saving.");
            }

            ServerUp = false;
        }