コード例 #1
0
        /// <inheritdoc/>
        public UdpActions DetectRequestType(ReadOnlySpan <byte> bytes)
        {
            if (bytes.Length < 8)
            {
                return(UdpActions.Unknown);
            }

            var protoOrConnectionId = _util.GetLong(bytes.Slice(0, 8));

            if (protoOrConnectionId == UdpConstants.ProtocolId)
            {
                return(ValidateConnectRequest(bytes) ? UdpActions.Connect : UdpActions.Unknown);
            }

            if (bytes.Length < 12)
            {
                return(UdpActions.Unknown);
            }

            var action = _util.GetInt(bytes.Slice(8, 4));

            switch (action)
            {
            case (int)UdpActions.Announce:
                return(ValidateAnnounceRequest(bytes) ? UdpActions.Announce : UdpActions.Unknown);

            case (int)UdpActions.Scrape:
                return(ValidateScrapeRequest(bytes) ? UdpActions.Scrape : UdpActions.Unknown);

            default:
                return(UdpActions.Unknown);
            }
        }
コード例 #2
0
        /// <inheritdoc/>
        public ConnectResponse DeserializeConnectResponse(ReadOnlySpan <byte> bytes)
        {
            if (_validator != null && !_validator.ValidateConnectResponse(bytes))
            {
                throw new ArgumentException(MalformedFormat);
            }
            var transactionId = _util.GetInt(bytes.Slice(4, 4));
            var connectionId  = _util.GetLong(bytes.Slice(8, 8));

            return(new ConnectResponse(connectionId, transactionId));
        }