Inheritance: UdpTrackerMessage
        public static UdpTrackerMessage DecodeMessage(byte[] buffer, int offset, int count, MessageType type)
        {
            UdpTrackerMessage m;
            var action = type == MessageType.Request ? ReadInt(buffer, offset + 8) : ReadInt(buffer, offset);
            switch (action)
            {
                case 0:
                    if (type == MessageType.Request)
                        m = new ConnectMessage();
                    else
                        m = new ConnectResponseMessage();
                    break;
                case 1:
                    if (type == MessageType.Request)
                        m = new AnnounceMessage();
                    else
                        m = new AnnounceResponseMessage();
                    break;
                case 2:
                    if (type == MessageType.Request)
                        m = new ScrapeMessage();
                    else
                        m = new ScrapeResponseMessage();
                    break;
                case 3:
                    m = new ErrorMessage();
                    break;
                default:
                    throw new ProtocolException(string.Format("Invalid udp message received: {0}", buffer[offset]));
            }

            try
            {
                m.Decode(buffer, offset, count);
            }
            catch
            {
                m = new ErrorMessage(0, "Couldn't decode the tracker response");
            }
            return m;
        }
Example #2
0
        private async Task ConnectAsync()
        {
            var connectMessage = new ConnectMessage();
            var port = Uri.IsDefaultPort ? 80 : Uri.Port;

            await _tracker.ConnectAsync(new HostName(Uri.Host), port.ToString());

            var responseBytes = await SendAndReceiveAsync(connectMessage);
            var msg = Receive(connectMessage, responseBytes);

            if (msg == null)
                throw new Exception(FailureMessage);

            var rsp = msg as ConnectResponseMessage;
            if (rsp == null)
            {
                FailureMessage = ((ErrorMessage) msg).Error;
                throw new Exception(FailureMessage);
            }
            _connectionId = rsp.ConnectionId;
            _hasConnected = true;
        }