/// <summary>
        /// Send the outgoing buffer to the specified remote destination.
        /// </summary>

        void EndSend(IPEndPoint ip)
        {
            mBuffer.EndPacket();
            mUdp.Send(mBuffer, ip);
            mBuffer.Recycle();
            mBuffer = null;
        }
        /// <summary>
        /// Send periodic updates.
        /// </summary>

        void ThreadFunction()
        {
            mInternal = new IPEndPoint(Tools.localAddress, mGameServer.tcpPort);
            mExternal = new IPEndPoint(Tools.externalAddress, mGameServer.tcpPort);

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

                if (mShutdown)
                {
                    Buffer       buffer = Buffer.Create();
                    BinaryWriter writer = buffer.BeginPacket(Packet.RequestRemoveServer);
                    writer.Write(GameServer.gameID);
                    Tools.Serialize(writer, mInternal);
                    Tools.Serialize(writer, mExternal);
                    buffer.EndPacket();
                    mUdp.Send(buffer, mRemoteAddress);
                    buffer.Recycle();
                    mThread = null;
                    break;
                }

                if (mNextSend < time && mGameServer != null)
                {
                    mNextSend = time + 3000;
                    Buffer buffer = Buffer.Create();
                    var    writer = buffer.BeginPacket(Packet.RequestAddServer);
                    writer.Write(GameServer.gameID);
                    writer.Write(mGameServer.name);
                    writer.Write((short)mGameServer.playerCount);
                    Tools.Serialize(writer, mInternal);
                    Tools.Serialize(writer, mExternal);
                    buffer.EndPacket();
                    mUdp.Send(buffer, mRemoteAddress);
                    buffer.Recycle();
                }

                try { Thread.Sleep(10); }
                catch (System.Threading.ThreadInterruptedException) { return; }
            }
        }
Exemple #3
0
        /// <summary>
        /// Send the outgoing buffer.
        /// </summary>

        public void EndSend(bool reliable)
        {
            mBuffer.EndPacket();
#if UNITY_WEBPLAYER
            mTcp.SendTcpPacket(mBuffer);
#else
            if (reliable || !mUdpIsUsable || mServerUdpEndPoint == null || !mUdp.isActive)
            {
                mTcp.SendTcpPacket(mBuffer);
            }
            else
            {
                mUdp.Send(mBuffer, mServerUdpEndPoint);
            }
#endif
            mBuffer.Recycle();
            mBuffer = null;
        }
        /// <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>
        /// Send periodic updates.
        /// </summary>

        void ThreadFunction()
        {
            mInternal = new IPEndPoint(Tools.localAddress, mGameServer.tcpPort);
            mExternal = new IPEndPoint(Tools.externalAddress, mGameServer.tcpPort);

            for (; ;)
            {
                long time = DateTime.Now.Ticks / 10000;

                if (mShutdown)
                {
                    Buffer       buffer = Buffer.Create();
                    BinaryWriter writer = buffer.BeginPacket(Packet.RequestRemoveServer);
                    writer.Write(GameServer.gameID);
                    Tools.Serialize(writer, mInternal);
                    Tools.Serialize(writer, mExternal);
                    buffer.EndPacket();
                    mUdp.Send(buffer, mRemoteAddress);
                    buffer.Recycle();
                    mThread = null;
                    break;
                }

                if (mNextSend < time && mGameServer != null)
                {
                    mNextSend = time + 3000;
                    Buffer       buffer = Buffer.Create();
                    BinaryWriter writer = buffer.BeginPacket(Packet.RequestAddServer);
                    writer.Write(GameServer.gameID);
                    writer.Write(mGameServer.name);
                    writer.Write((short)mGameServer.playerCount);
                    Tools.Serialize(writer, mInternal);
                    Tools.Serialize(writer, mExternal);
                    buffer.EndPacket();
                    mUdp.Send(buffer, mRemoteAddress);
                    buffer.Recycle();
                }
                Thread.Sleep(10);
            }
        }