예제 #1
0
        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);
                }
            }
        }
예제 #2
0
        /// <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);
        }