/// <summary>
    /// Dispose socket
    /// </summary>
    public void Disconnect()
    {
        if (client != null)
        {
            client.Close();
        }

        status = L4D2ServerAgentStatus.Offline;
        client = null;
        StopAllCoroutines();
    }
    // Update is called once per frame
    void Update()
    {
        if (client == null)
        {
            return;
        }

        client.AsyncProcessingMessage();
        if (status == L4D2ServerAgentStatus.OK && lastRespondTime + notRespondingThreashold < Time.time)
        {
            status = L4D2ServerAgentStatus.NotResponding;
        }
    }
    /// <summary>
    /// Create new socket
    /// </summary>
    public void Connect()
    {
        if (client != null)
        {
            client.Close();
            StopAllCoroutines();
        }

        status                 = L4D2ServerAgentStatus.WaitForChallengeNumber;
        lastRespondTime        = Time.time;
        client                 = new ValveServerQueryClient(ip, port);
        client.MessageHandler += OnReceiveMessage;
        StartCoroutine(ChallengeNumberAcquireRoutine());
    }
    private void OnReceiveMessage(ByteBuffer buff)
    {
        status          = L4D2ServerAgentStatus.OK;
        lastRespondTime = Time.time;

        ValveServerResponseData data = new ValveServerResponseData(buff);

        switch ((ValveServerResponseType)data.header)
        {
        case ValveServerResponseType.A2S_Info:
            serverInfo = data.serverInfoBody;
            break;

        case ValveServerResponseType.A2S_ChallengeNumber:
            challengeNumberInfo = data.challengeNumberBody;
            break;

        case ValveServerResponseType.A2S_Player:
            playersInfo = data.playersInfoBody;
            break;

        default: break;
        }
    }