public bool InitAsMasterPeer(int _inPort, string _inName, PeerToPeerManager _p2p)
    {
        if (!InitSocket(_inPort, false))
        {
            return(false);
        }
        mPeerToPeerManager = _p2p;
        mPeerToPeerManager.SetInLobby(true);
        mPlayerId        = 1;
        mIsMasterPeer    = true;
        mHighestPlayerId = mPlayerId;
        mName            = _inName;
        mPlayerCount     = 1;

        mState = NetworkState.Lobby;

        mPlayerIdToName.Add(mPlayerId, mName);
        return(true);
    }
    /// <summary>
    /// Trường hợp xảy ra khi được chấp nhận kết nối từ master peer
    /// </summary>
    /// <param name="input"></param>
    private void HandleWelcomePacket(ref InputMemoryBitStream input)
    {
        // đọc player id được cấp phát
        int playerid = 0, masterPeerPlayerid = 0;

        input.Read(ref playerid);
        UpdateHighestPlayerId(playerid);
        mPlayerId = playerid;

        mPlayerIdToName.Add(mPlayerId, mName);

        // bây giờ đọc player id của master peer.
        input.Read(ref masterPeerPlayerid);
        UpdateHighestPlayerId(masterPeerPlayerid);
        mPlayerIdToEndpointDic.Add(masterPeerPlayerid, mMasterPeerEndP);
        mEndpointToPlayerIdDic.Add(mMasterPeerEndP, masterPeerPlayerid);

        // tiếp theo đọc thông tin của tất cả người chơi còn lại.
        int playerCount = 0;

        input.Read(ref playerCount);
        mPlayerCount = playerCount;
        EndPoint Endp = null;

        for (int i = 0; i < playerCount - 1; i++)
        {
            input.Read(ref playerid);
            UpdateHighestPlayerId(playerid);

            ReadIPv4(ref input, ref Endp);
            mPlayerIdToEndpointDic.Add(playerid, Endp);
            mEndpointToPlayerIdDic.Add(Endp, playerid);
        }

        // Đọc tên của tất cả người chơi đã tham gia trò chơi
        string name = " ";

        for (int i = 0; i < playerCount; i++)
        {
            input.Read(ref playerid);
            input.Read(ref name);
            mPlayerIdToName.Add(playerid, name);
        }

        mPlayerCount++;

        // Gửi 1 gói thông báo cho các player khác là tôi đã tham gia trò chơi
        OutputMemoryBitStream output = new OutputMemoryBitStream();

        output.Write(kIntroCC);
        output.Write(mPlayerId);
        output.Write(mName);

        foreach (var pair in mPlayerIdToEndpointDic)
        {
            SendPacket(output, pair.Value);
        }

        mPeerToPeerManager.SetInLobby(true);
        // đã vào phòng đợi để sẵn sàng tham gia trò chơi
        mState = NetworkState.Lobby;
    }