예제 #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
 internal static PeersListPacket_SharedPeerIpv4 Decode(byte[] data, ref int index)
 {
     return(new PeersListPacket_SharedPeerIpv4(
                StreamId.Decode(data, ref index),
                PeerId.Decode(data, ref index),
                new IPEndPoint(new IPAddress(BinaryProcedures.DecodeUInt32(data, ref index)), BinaryProcedures.DecodeUInt16(data, ref index))
                ));
 }
예제 #3
0
        internal static (PeerId fromPeerId, PeerId toPeerId, StreamId streamId, string extensionId) ParseExtensionSignalingPacket(BinaryReader reader)
        {
            var fromPeerId  = PeerId.Decode(reader);
            var toPeerId    = PeerId.Decode(reader);
            var streamId    = StreamId.Decode(reader);
            var extensionId = P2ptpCommon.DecodeString1ASCII(reader);

            return(fromPeerId, toPeerId, streamId, extensionId);
        }
예제 #4
0
        internal static (ILocalPeerExtension extension, StreamId streamId, int index) ParseReceivedExtensionPayloadPacket(byte[] data, ILocalPeerExtension[] extensions)
        {
            var extension = extensions.FirstOrDefault(x => ExtensionPacketHeaderMatches(x, data));

            if (extension != null)
            {
                var index    = extension.PayloadPacketHeader.Length;
                var streamId = StreamId.Decode(data, ref index);
                return(extension, streamId, index);
            }
            return(null, null, 0);
        }
예제 #5
0
        public PeersListPacketIpv4(byte[] data)
        {
            if (data.Length < EncodedSizeMinimum)
            {
                throw new ArgumentException(nameof(data));
            }
            var index = P2ptpCommon.HeaderSize;

            FromPeerId = PeerId.Decode(data, ref index);
            StreamId   = StreamId.Decode(data, ref index);

            var count = data[index++];

            SharedPeers = new PeersListPacket_SharedPeerIpv4[count];
            for (byte i = 0; i < count; i++)
            {
                SharedPeers[i] = PeersListPacket_SharedPeerIpv4.Decode(data, ref index);
            }
        }
예제 #6
0
        public PeerHelloPacket(byte[] data)
        {
            if (data.Length < MinEncodedSize)
            {
                throw new ArgumentException(nameof(data));
            }
            var index = P2ptpCommon.HeaderSize;

            FromPeerId      = PeerId.Decode(data, ref index);
            StreamId        = StreamId.Decode(data, ref index);
            ToPeerId        = PeerId.Decode(data, ref index);
            LibraryVersion  = P2ptpCommon.DecodeUInt32(data, ref index);
            ProtocolVersion = P2ptpCommon.DecodeUInt16(data, ref index);
            Status          = (PeerHelloRequestStatus)data[index++];
            RequestTime32   = P2ptpCommon.DecodeUInt32(data, ref index);
            RoleFlags       = data[index++];
            var extensionIdsLength = data[index++];

            ExtensionIds = new string[extensionIdsLength];
            for (byte i = 0; i < extensionIdsLength; i++)
            {
                ExtensionIds[i] = P2ptpCommon.DecodeString1ASCII(data, ref index);
            }
        }