Exemple #1
0
        /// <summary>
        /// Process all incoming packets.
        /// </summary>

        public void ProcessPackets()
        {
            mMyTime = DateTime.UtcNow.Ticks / 10000;

            // Request pings every so often, letting the server know we're still here.
            if (mTcp.isConnected && mCanPing && mPingTime + 4000 < mMyTime)
            {
                mCanPing  = false;
                mPingTime = mMyTime;
                BeginSend(Packet.RequestPing);
                EndSend();
            }

            Buffer buffer    = null;
            bool   keepGoing = true;

#if !UNITY_WEBPLAYER
            IPEndPoint ip = null;

            while (keepGoing && isActive && mUdp.ReceivePacket(out buffer, out ip))
            {
                mUdpIsUsable = true;
                keepGoing    = ProcessPacket(buffer, ip);
                buffer.Recycle();
            }
#endif
            while (keepGoing && isActive && mTcp.ReceivePacket(out buffer))
            {
                keepGoing = ProcessPacket(buffer, null);
                buffer.Recycle();
            }
        }
Exemple #2
0
        /// <summary>
        /// Thread that will be processing incoming data.
        /// </summary>

        void ThreadFunction()
        {
            for (; ;)
            {
#if !STANDALONE
                if (TNManager.isPaused)
                {
                    Thread.Sleep(500);
                    continue;
                }
#endif
                mTime = DateTime.UtcNow.Ticks / 10000;

                // Cleanup a list of servers by removing expired entries
                mList.Cleanup(mTime);

                Buffer     buffer;
                IPEndPoint ip;

                // Process incoming UDP packets
                while (mUdp != null && mUdp.listeningPort != 0 && mUdp.ReceivePacket(out buffer, out ip))
                {
                    try { ProcessPacket(buffer, ip); }
                    catch (System.Exception) { }

                    if (buffer != null)
                    {
                        buffer.Recycle();
                        buffer = null;
                    }
                }
                Thread.Sleep(1);
            }
        }
        /// <summary>
        /// Keep receiving incoming packets.
        /// </summary>

        void Update()
        {
            Buffer     buffer;
            IPEndPoint ip;
            bool       changed = false;
            long       time    = System.DateTime.UtcNow.Ticks / 10000;

            // Receive and process UDP packets one at a time
            while (mUdp != null && mUdp.ReceivePacket(out buffer, out ip))
            {
                if (buffer.size > 0)
                {
                    try
                    {
                        BinaryReader reader   = buffer.BeginReading();
                        Packet       response = (Packet)reader.ReadByte();

                        if (response == Packet.ResponseServerList)
                        {
                            isActive  = true;
                            mNextSend = time + 3000;
                            knownServers.ReadFrom(reader, time);
                            knownServers.Cleanup(time);
                            changed = true;
                        }
                        else if (response == Packet.Error)
                        {
                            errorString = reader.ReadString();
                            Debug.LogWarning(errorString);
                            changed = true;
                        }
                    }
                    catch (System.Exception) { }
                }
                buffer.Recycle();
            }

            // Clean up old servers
            if (knownServers.Cleanup(time))
            {
                changed = true;
            }

            // Trigger the listener callback
            if (changed && onChange != null)
            {
                onChange();
            }
            else if (mNextSend < time && mUdp != null)
            {
                // Send out the update request
                mNextSend = time + 3000;
                mUdp.Send(mRequest, mRemoteAddress);
            }
        }
        /// <summary>
        /// Thread that will be processing incoming data.
        /// </summary>

        void ThreadFunction()
        {
            for (; ;)
            {
                Buffer buffer;
                bool   received = false;
                mTime = DateTime.Now.Ticks / 10000;
                IPEndPoint ip;

                // Stop the listener if the port is 0 (MakePrivate() was called)
                if (mListenerPort == 0)
                {
                    if (mListener != null)
                    {
                        mListener.Stop();
                        mListener = null;
                        if (lobbyLink != null)
                        {
                            lobbyLink.Stop();
                        }
                        if (onShutdown != null)
                        {
                            onShutdown();
                        }
                    }
                }
                else
                {
                    // Add all pending connections
                    while (mListener != null && mListener.Pending())
                    {
#if STANDALONE
                        TcpPlayer p = AddPlayer(mListener.AcceptSocket());
                        Console.WriteLine(p.address + " has connected");
#else
                        AddPlayer(mListener.AcceptSocket());
#endif
                    }
                }

                // Process datagrams first
                while (mUdp.listeningPort != 0 && mUdp.ReceivePacket(out buffer, out ip))
                {
                    if (buffer.size > 0)
                    {
                        TcpPlayer player = GetPlayer(ip);

                        if (player != null)
                        {
                            try
                            {
                                if (ProcessPlayerPacket(buffer, player, false))
                                {
                                    received = true;
                                }
                            }
                            catch (System.Exception) { RemovePlayer(player); }
                        }
                    }
                    buffer.Recycle();
                }

                // Process player connections next
                for (int i = 0; i < mPlayers.size;)
                {
                    TcpPlayer player = mPlayers[i];

                    // Process up to 100 packets at a time
                    for (int b = 0; b < 100 && player.ReceivePacket(out buffer); ++b)
                    {
                        if (buffer.size > 0)
                        {
                            try
                            {
                                if (ProcessPlayerPacket(buffer, player, true))
                                {
                                    received = true;
                                }
                            }
#if STANDALONE
                            catch (System.Exception ex)
                            {
                                Console.WriteLine("ERROR (ProcessPlayerPacket): " + ex.Message);
                                RemovePlayer(player);
                            }
#else
                            catch (System.Exception) { RemovePlayer(player); }
#endif
                        }
                        buffer.Recycle();
                    }

                    // Time out -- disconnect this player
                    if (player.stage == TcpProtocol.Stage.Connected)
                    {
                        // Up to 10 seconds can go without a single packet before the player is removed
                        if (player.lastReceivedTime + 10000 < mTime)
                        {
#if STANDALONE
                            Console.WriteLine(player.address + " has timed out");
#endif
                            RemovePlayer(player);
                            continue;
                        }
                    }
                    else if (player.lastReceivedTime + 2000 < mTime)
                    {
#if STANDALONE
                        Console.WriteLine(player.address + " has timed out");
#endif
                        RemovePlayer(player);
                        continue;
                    }
                    ++i;
                }
                if (!received)
                {
                    Thread.Sleep(1);
                }
            }
        }