Segment descriptor structure.
        /// <summary>
        /// Create BATCHED_OFFER_MESSAGE package.
        /// </summary>
        /// <param name="connectionInfoPort">
        /// A 16-bit unsigned integer that MUST be set by the client to the port
        /// on which it is listening as a server-role peer, for use with the retrieval protocol.
        /// </param>
        /// <param name="contentInfo">A Content Information V2 data structure.</param>
        /// <returns>Return the BATCHED_OFFER_MESSAGE.</returns>
        public BATCHED_OFFER_MESSAGE CreateBatchedOfferMessage(
            int connectionInfoPort,
            Content_Information_Data_Structure_V2 contentInfo)
        {
            MESSAGE_HEADER messageHeader;

            messageHeader.MajorVersion = 2;
            messageHeader.MinorVersion = 0;
            messageHeader.MsgType      = PCHC_MESSAGE_TYPE.BATCHED_OFFER_MESSAGE;
            messageHeader.Padding      = new byte[4];

            CONNECTION_INFORMATION connectionInfo;

            connectionInfo.Padding = new byte[6];
            connectionInfo.Port    = (ushort)connectionInfoPort;

            BATCHED_OFFER_MESSAGE batchedOfferMessage;

            batchedOfferMessage.MessageHeader  = messageHeader;
            batchedOfferMessage.ConnectionInfo = connectionInfo;

            List <SegmentDescriptor> segmentDescriptors = new List <SegmentDescriptor>();

            for (int i = 0; i < contentInfo.chunks.Length; i++)
            {
                var chunk = contentInfo.chunks[i];
                for (int j = 0; j < chunk.chunkData.Length; j++)
                {
                    var segment = chunk.chunkData[j];
                    SegmentDescriptor segmentDescriptor = new SegmentDescriptor();
                    segmentDescriptor.BlockSize        = segment.cbSegment;
                    segmentDescriptor.SegmentSize      = segment.cbSegment;
                    segmentDescriptor.SizeOfContentTag = 16;
                    segmentDescriptor.ContentTag       = new byte[16];
                    segmentDescriptor.HashAlgorithm    = (byte)contentInfo.dwHashAlgo;
                    segmentDescriptor.SegmentHoHoDk    = contentInfo.GetSegmentId(i, j);
                    segmentDescriptors.Add(segmentDescriptor);
                }
            }
            batchedOfferMessage.SegmentDescriptors = segmentDescriptors.ToArray();

            return(batchedOfferMessage);
        }
        /// <summary>
        /// Create BATCHED_OFFER_MESSAGE package.
        /// </summary>
        /// <param name="connectionInfoPort">
        /// A 16-bit unsigned integer that MUST be set by the client to the port 
        /// on which it is listening as a server-role peer, for use with the retrieval protocol.
        /// </param>
        /// <param name="contentInfo">A Content Information V2 data structure.</param>
        /// <returns>Return the BATCHED_OFFER_MESSAGE.</returns>
        public BATCHED_OFFER_MESSAGE CreateBatchedOfferMessage(
            int connectionInfoPort,
            Content_Information_Data_Structure_V2 contentInfo)
        {
            MESSAGE_HEADER messageHeader;

            messageHeader.MajorVersion = 2;
            messageHeader.MinorVersion = 0;
            messageHeader.MsgType = PCHC_MESSAGE_TYPE.BATCHED_OFFER_MESSAGE;
            messageHeader.Padding = new byte[4];

            CONNECTION_INFORMATION connectionInfo;

            connectionInfo.Padding = new byte[6];
            connectionInfo.Port = (ushort)connectionInfoPort;

            BATCHED_OFFER_MESSAGE batchedOfferMessage;
            batchedOfferMessage.MessageHeader = messageHeader;
            batchedOfferMessage.ConnectionInfo = connectionInfo;

            List<SegmentDescriptor> segmentDescriptors = new List<SegmentDescriptor>();
            for (int i = 0; i < contentInfo.chunks.Length; i++)
            {
                var chunk = contentInfo.chunks[i];
                for (int j = 0; j < chunk.chunkData.Length; j++)
                {
                    var segment = chunk.chunkData[j];
                    SegmentDescriptor segmentDescriptor = new SegmentDescriptor();
                    segmentDescriptor.BlockSize = segment.cbSegment;
                    segmentDescriptor.SegmentSize = segment.cbSegment;
                    segmentDescriptor.SizeOfContentTag = 16;
                    segmentDescriptor.ContentTag = new byte[16];
                    segmentDescriptor.HashAlgorithm = (byte)contentInfo.dwHashAlgo;
                    segmentDescriptor.SegmentHoHoDk = contentInfo.GetSegmentId(i, j);
                    segmentDescriptors.Add(segmentDescriptor);
                }
            }
            batchedOfferMessage.SegmentDescriptors = segmentDescriptors.ToArray();

            return batchedOfferMessage;
        }