예제 #1
0
    /// <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);
        }
    }