コード例 #1
0
ファイル: GameServer.cs プロジェクト: Draiget/EnviumNetTest
        public override void SendClientMessages(bool sendSnapshots)
        {
            var receivingClients = new List <GameClient>();

            foreach (var cl in Clients)
            {
                var client = (GameClient)cl;

                if (!client.ShouldSendMessage())
                {
                    continue;
                }

                Out.Debug("Write snapshot");
                if (sendSnapshots && client.IsActive())
                {
                    receivingClients.Add(client);
                }
                else
                {
                    // if client never send a netchannl packet yet, send ConnectionAccept because it could get lost in multiplayer
                    if (client.NetChannel.GetSequenceNr(EFlowType.Incoming) == 0)
                    {
                        Networking.OutOfBandPrintf(Socket, client.NetChannel.GetRemoteAddress(), "{0}00000000000000", (char)EConnectionType.ConnectionAccept);
                    }

                    client.NetChannel.Transmit();
                    client.UpdateSendState();
                }
            }

            if (receivingClients.Count > 0)
            {
                // if any client wants an update, take new snapshot now
                var snapshot = Program.FrameSnapshotManager.TakeTickSnapshot(TickCount);

                // copy temp ents references to pSnapshot
                CopyTempEntities(snapshot);

                foreach (var cl in receivingClients)
                {
                    var frame = cl.GetSendFrame();
                    if (frame == null)
                    {
                        continue;
                    }

                    cl.SendSnapshot(frame);
                    cl.UpdateSendState();
                }

                snapshot.ReleaseRefrence();
            }
        }
コード例 #2
0
        private void ConnectClient(EndPoint addr, int protocol, int authProtocol, int challenge, string name, string password)
        {
            if (name == null || password == null)
            {
                return;
            }

            if (!CheckChallengeNr(addr, challenge))
            {
                RejectConnecton(addr, "Bad challenge.\n");
                return;
            }

            if (!CheckIPConnectionReuse(addr))
            {
                RejectConnecton(addr, "Too many pending connections.\n");
                return;
            }

            if (!CheckIPRestrictions(addr))
            {
                RejectConnecton(addr, "LAN servers are resticted to local clients only (class C).\n");
                return;
            }

            if (!CheckPassword(addr, password))
            {
                Console.WriteLine("Client \"{0}\" [{1}]: password failed.\n", name, addr);
                RejectConnecton(addr, "Bad password.\n");
                return;
            }

            if (Clients.Count + 1 > Program.SvMaxPlayers)
            {
                RejectConnecton(addr, "Server is full.\n");
                return;
            }

            var client  = new GameClient(GetFreeSlot(), this);
            var channel = Networking.CreateChannel(Socket, name, addr, client);

            if (channel == null)
            {
                RejectConnecton(addr, "Failed to create net channel!\n");
                return;
            }

            // set channel challenge
            channel.SetChallengeNr(challenge);

            // make sure client is reset and clear
            client.Connect(name, channel);

            client.SnapshotInterval = 1.0f / 20.0f;
            client.NextMessageTime  = Networking.NetTime + client.SnapshotInterval;

            // add client to global list
            Clients.Add(client);

            // tell client connection worked, now use netchannels
            Networking.OutOfBandPrintf(Socket, addr, "{0}00000000000000", (char)EConnectionType.ConnectionAccept);

            Out.MsgC(ConsoleColor.Yellow, "Client \"{0}\" has connected from [{1}]", client.GetClientName(), channel.GetRemoteAddress());
        }
コード例 #3
0
        public void RejectConnecton(EndPoint addr, string format, params object[] args)
        {
            var message = string.Format(format, args);

            Networking.OutOfBandPrintf(Socket, addr, "{0}{1}", (char)EConnectionType.ConnectionReject, message);
        }