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; }
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; }