/// <summary> /// Decodes the message. /// </summary> /// <param name="buffer">The buffer.</param> /// <param name="offset">The offset.</param> /// <param name="message">The message.</param> /// <returns> /// True if decoding was successful; false otherwise. /// </returns> public static bool TryDecode(byte[] buffer, int offset, out AnnounceMessage message) { long connectionId; long action; int transactionId; string infoHash; string peerId; long downloaded; long left; long uploaded; int trackingEvent; int ipaddress; uint key; int numberWanted; ushort port; message = null; if (buffer != null && buffer.Length >= offset + ConnectionIdLength + ActionLength + TransactionIdLength + InfoHashLength + PeerIdLength + DownloadedLength + LeftLength + UploadedLength + TrackingEventLength + IpAddressLength + KeyLength + NumWantLength + PortLength && offset >= 0) { connectionId = Message.ReadLong(buffer, ref offset); action = Message.ReadInt(buffer, ref offset); transactionId = Message.ReadInt(buffer, ref offset); infoHash = Message.ReadBytes(buffer, ref offset, 20).ToHexaDecimalString(); peerId = Message.ToPeerId(Message.ReadBytes(buffer, ref offset, 20)); downloaded = Message.ReadLong(buffer, ref offset); left = Message.ReadLong(buffer, ref offset); uploaded = Message.ReadLong(buffer, ref offset); trackingEvent = Message.ReadInt(buffer, ref offset); ipaddress = Message.ReadInt(buffer, ref offset); key = (uint)Message.ReadInt(buffer, ref offset); numberWanted = Message.ReadInt(buffer, ref offset); port = (ushort)Message.ReadShort(buffer, ref offset); if (connectionId >= 0 && action == (int)TrackingAction.Announce && transactionId >= 0 && infoHash.IsNotNullOrEmpty() && peerId.IsNotNullOrEmpty() && downloaded >= 0 && left >= 0 && uploaded >= 0 && trackingEvent >= 0 && trackingEvent <= 3 && port >= IPEndPoint.MinPort && port <= IPEndPoint.MaxPort) { message = new AnnounceMessage(connectionId, transactionId, infoHash, peerId, downloaded, left, uploaded, (TrackingEvent)trackingEvent, key, numberWanted, new IPEndPoint(new IPAddress(BitConverter.GetBytes(ipaddress)), port)); } } return(message != null); }
/// <summary> /// Tries to decode the message. /// </summary> /// <param name="buffer">The buffer.</param> /// <param name="offset">The offset.</param> /// <param name="messageType">Type of the message.</param> /// <param name="message">The decoded message.</param> /// <returns> /// True if message was successfully decoded; false otherwise. /// </returns> public static bool TryDecode(byte[] buffer, int offset, MessageType messageType, out TrackerMessage message) { int action; message = null; if (buffer.IsNotNullOrEmpty()) { action = messageType == MessageType.Request ? Message.ReadInt(buffer, ref offset) : Message.ReadInt(buffer, ref offset); offset = 0; if (action == (int)TrackingAction.Connect) { if (messageType == MessageType.Request) { ConnectMessage message2; ConnectMessage.TryDecode(buffer, offset, out message2); message = message2; } else { ConnectResponseMessage message2; ConnectResponseMessage.TryDecode(buffer, offset, out message2); message = message2; } } else if (action == (int)TrackingAction.Announce) { if (messageType == MessageType.Request) { AnnounceMessage message2; AnnounceMessage.TryDecode(buffer, offset, out message2); message = message2; } else { AnnounceResponseMessage message2; AnnounceResponseMessage.TryDecode(buffer, offset, out message2); message = message2; } } else if (action == (int)TrackingAction.Scrape) { if (messageType == MessageType.Request) { ScrapeMessage message2; ScrapeMessage.TryDecode(buffer, offset, out message2); message = message2; } else { ScrapeResponseMessage message2; ScrapeResponseMessage.TryDecode(buffer, offset, out message2); message = message2; } } else if (action == (int)TrackingAction.Error) { ErrorMessage message2; ErrorMessage.TryDecode(buffer, offset, out message2); message = message2; } else { // could not decode UDP message } } return(message != null); }