async Task <HandshakeResult> WaitHandshakeAccept() { while (true) { var receive = await m_Socket.ReceiveAsync(); var buf = receive.Buffer; int size = buf.Length; if (size == 0 || buf[0] != (byte)PeerToPeerAccept.Type) { continue; } int offset = 5; int nonce = BinaryUtil.ReadInt(buf, ref offset); EncryptorKey key = default; key.Cookie = m_Cookie; key.MajorVersion = Protocol.MajorVersion; key.MinorVersion = Protocol.MinorVersion; key.Nonce = nonce; key.ConnectionId = m_SelfId; key.Random = new ArraySegment <byte>(m_Randam); var encryptor = m_EncryptorGenerator.Generate(in key); if (!PeerToPeerAccept.TryUnpack(buf, size, encryptor, out var packet)) { throw new Exception("fail unpack HandshakeAccept"); } m_RemoteEP = receive.RemoteEndPoint; return(new HandshakeResult(encryptor, packet.GetPeerToPeerList())); } }
public bool OnHandshakeAccept(byte[] buf, int size, out PeerEntry peer, IPEndPoint remoteEP) { if (size < 9) { peer = null; return(false); } int offset = 5; int nonce = BinaryUtil.ReadInt(buf, ref offset); var key = new EncryptorKey(m_Request, m_Info.Randam, nonce); var encryptor = m_Connection.m_EncryptorGenerator.Generate(key); if (!PeerToPeerAccept.TryUnpack(buf, size, encryptor, out var packet)) { peer = null; return(false); } peer = new PeerEntry(packet.ConnectionId, nonce, encryptor, remoteEP); return(true); }