public PeerHelloPacket(byte[] packetUdpPayloadData) { // if (packetUdpPayloadData.Length < MinEncodedSize) throw new ArgumentException(nameof(packetUdpPayloadData)); var index = P2ptpCommon.HeaderSize; FromPeerId = PeerId.Decode(packetUdpPayloadData, ref index); StreamId = StreamId.Decode(packetUdpPayloadData, ref index); ToPeerId = PeerId.Decode(packetUdpPayloadData, ref index); LibraryVersion = PacketProcedures.DecodeUInt32(packetUdpPayloadData, ref index); ProtocolVersion = PacketProcedures.DecodeUInt16(packetUdpPayloadData, ref index); Status = (PeerHelloRequestStatus)packetUdpPayloadData[index++]; RequestTime32 = PacketProcedures.DecodeUInt32(packetUdpPayloadData, ref index); Flags = packetUdpPayloadData[index++]; var extensionIdsLength = packetUdpPayloadData[index++]; ExtensionIds = new string[extensionIdsLength]; for (byte i = 0; i < extensionIdsLength; i++) { ExtensionIds[i] = PacketProcedures.DecodeString1ASCII(packetUdpPayloadData, ref index); } if (index < packetUdpPayloadData.Length) { // after version 190608 RequestSequenceNumber = PacketProcedures.DecodeUInt16(packetUdpPayloadData, ref index); ResponseCpuDelayMs = PacketProcedures.DecodeUInt16(packetUdpPayloadData, ref index); RequestedFromIp = PacketProcedures.DecodeString1ASCII(packetUdpPayloadData, ref index); var reader = PacketProcedures.CreateBinaryReader(packetUdpPayloadData, index); if (FlagIshareMyIpLocation) { IpLocationData = IpLocationData.Decode(reader); } } }
/// <summary> /// creates response to request and sends the response /// </summary> /// <param name="localPeerId">optional local test node ID, is sent by server to new peers who dont know server's PeerId</param> internal static void Respond(PeerHelloPacket requestPacket, PeerHelloRequestStatus status, PeerId localPeerId, SocketWithReceiver socket, IPEndPoint remoteEndPoint, ushort?responseCpuDelayMs = null, bool thisPeerRoleAsUser = false, IpLocationData localIpLocationData = null) { var responsePacket = new PeerHelloPacket(requestPacket, status, localPeerId, thisPeerRoleAsUser, responseCpuDelayMs, remoteEndPoint.Address.ToString()); if (localIpLocationData != null && requestPacket.FlagIwantToGetYourIpLocation) { responsePacket.IpLocationData = localIpLocationData; } var responseData = responsePacket.Encode(); socket.UdpSocket.Send(responseData, responseData.Length, remoteEndPoint); }