public void Update()
    {
        uint Length;
        int  Channel;

        while (PacketAvailable(out Length, out Channel))
        {
            CSteamID UserID;
            uint     RealLength;
            if (SteamNetworking.ReadP2PPacket(RecvData, Length, out RealLength, out UserID, Channel))
            {
                SteamServerConnection ClientConnection = ConnectedUsers.Find(x => x.RemoteID.m_SteamID == UserID.m_SteamID);

                if (ClientConnection != null)
                {
                    ClientConnection.ProcessData(RecvData, (int)RealLength, Channel != 0);
                }
            }
        }
    }
 // User Started Communication
 void OnP2PSessionRequest(P2PSessionRequest_t pCallback)
 {
     for (int i = 0; i < SteamMatchmaking.GetNumLobbyMembers(CLobbyID); i++)
     {
         if (SteamMatchmaking.GetLobbyMemberByIndex(CLobbyID, i).m_SteamID == pCallback.m_steamIDRemote.m_SteamID)
         {
             if (SteamNetworking.AcceptP2PSessionWithUser(pCallback.m_steamIDRemote))
             {
                 WriteEvent($"Accepted P2P Connection With User: {pCallback.m_steamIDRemote.m_SteamID}", LogType.Info);
                 long fakeAddress = 0;
                 SteamServerConnection NewClient = new SteamServerConnection(pCallback.m_steamIDRemote.m_SteamID, this, Interlocked.Increment(ref currentEndPointCount), out fakeAddress);
                 SteamMatchmaking.SetLobbyData(CLobbyID, fakeAddress.ToString(), pCallback.m_steamIDRemote.m_SteamID.ToString());
                 RegisterUser(NewClient);
                 RegisterConnection(NewClient);
             }
             else
             {
                 WriteEvent($"Failed P2P Connection With User: {pCallback.m_steamIDRemote.m_SteamID}", LogType.Info);
             }
             return;
         }
     }
 }
    // User Joined/Left
    void OnLobbyChatUpdate(LobbyChatUpdate_t pCallback)
    {
        if (pCallback.m_ulSteamIDLobby == LobbyID)
        {
            switch (pCallback.m_rgfChatMemberStateChange)
            {
            case ((uint)EChatMemberStateChange.k_EChatMemberStateChangeDisconnected):
            case ((uint)EChatMemberStateChange.k_EChatMemberStateChangeKicked):
            case ((uint)EChatMemberStateChange.k_EChatMemberStateChangeBanned):
            case ((uint)EChatMemberStateChange.k_EChatMemberStateChangeLeft):
                SteamNetworking.CloseP2PSessionWithUser(new CSteamID(pCallback.m_ulSteamIDUserChanged));
                SteamServerConnection ClientConnection = ConnectedUsers.Find(x => x.RemoteID.m_SteamID == pCallback.m_ulSteamIDUserChanged);

                if (ClientConnection != null)
                {
                    ClientConnection.UserDisconnected();
                    UnregisterUser(ClientConnection);
                }

                break;
            }
        }
    }
 public void UnregisterUser(SteamServerConnection user)
 {
     lock (ConnectedUsers)
         ConnectedUsers.Remove(user);
 }
 public void RegisterUser(SteamServerConnection user)
 {
     lock (ConnectedUsers)
         ConnectedUsers.Add(user);
 }