예제 #1
0
        public static bool TryUnpack(byte[] buf, int size, Encryptor encryptor, out PeerToPeerList packet)
        {
            int offset       = 1;
            var connectionId = BinaryUtil.ReadInt(buf, ref offset);
            var revision     = buf[offset++];

            if (!encryptor.TryDecrypt(buf, 6, ref size))
            {
                packet = default;
                return(false);
            }

            var peerSize = buf[offset++];
            var peers    = new PeerInfo[peerSize];

            for (int i = 0; i < peers.Length; i++)
            {
                if (!PeerInfo.TryUnpack(buf, ref offset, out var info))
                {
                    packet = default;
                    return(false);
                }
                peers[i] = info;
            }
            packet = new PeerToPeerList(connectionId, revision, peers);
            return(true);
        }
예제 #2
0
 public PeerToPeerAccept(int connectionId, int nonce, PeerToPeerList list)
 {
     ConnectionId = connectionId;
     Nonce        = nonce;
     Revision     = list.Revision;
     Size         = list.Size;
     Peers        = list.Peers;
 }
예제 #3
0
 void UpdateP2PList()
 {
     if (m_SendP2PList == null)
     {
         m_SendP2PList = SendP2PList;
     }
     if (m_PeerToPeerListDirty)
     {
         m_PeerToPeerListDirty = false;
         var revision = m_PeerToPeerList.Revision;
         revision++;
         var randamKey = P2PTask.GetHostRandamKey();
         m_PeerToPeerList = new PeerToPeerList(SelfId, revision, m_PeerManager.CreatePeerInfoList(randamKey));
     }
     m_PeerManager.ForEach(m_SendP2PList, m_PeerToPeerList);
 }
예제 #4
0
        public void OnPeerToPeerList(byte[] buf, int size)
        {
            int offset       = 1;
            var connectionId = BinaryUtil.ReadInt(buf, ref offset);
            var revision     = buf[offset++];

            if (revision == m_P2PList.Revision)
            {
                return;
            }

            if (!m_PeerManager.TryGetValue(connectionId, out PeerEntry peer))
            {
                return;
            }

            if (PeerToPeerList.TryUnpack(buf, size, peer.Encryptor, out var packet))
            {
                m_P2PList = packet;
                UpdateList(packet.Peers, true);
            }
        }
예제 #5
0
 public virtual bool TryGetPeerToPeerList(out PeerToPeerList list)
 {
     list = default;
     return(false);
 }
예제 #6
0
 public HandshakeResult(Encryptor encryptor, PeerToPeerList list)
 {
     Encryptor = encryptor;
     List      = list;
 }
예제 #7
0
        void SendP2PList(PeerEntry peer, PeerToPeerList data)
        {
            var offset = data.Pack(m_SendBuffer, peer.Encryptor);

            m_Socket.Send(m_SendBuffer, 0, offset, peer.EndPoint);
        }
예제 #8
0
 public override bool TryGetPeerToPeerList(out PeerToPeerList list)
 {
     list = m_PeerToPeerList;
     return(IsHost);
 }