示例#1
0
        private void ConstructRequestData(DnsRequestMessage request, IDnsDatagramWriter writer)
        {
            DnsQuestion question = request.Question;

            /*
             *                                  1  1  1  1  1  1
             *    0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
             +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
             |                      ID                       |
             +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
             |QR|   Opcode  |AA|TC|RD|RA|   Z    |   RCODE   |
             +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
             |                    QDCOUNT                    |
             +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
             |                    ANCOUNT                    |
             +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
             |                    NSCOUNT                    |
             +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
             |                    ARCOUNT                    |
             +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
             * */
            // 4 more bytes for the type and class

            writer.WriteInt16NetworkOrder((short)request.Header.Identifier);
            writer.WriteUInt16NetworkOrder(request.Header.RawFlags);
            writer.WriteInt16NetworkOrder(1);   // we support single question only... (as most DNS servers anyways).
            writer.WriteInt16NetworkOrder(0);
            writer.WriteInt16NetworkOrder(0);
            writer.WriteInt16NetworkOrder(1);    // one additional for the Opt record.

            writer.WriteHostName(question.QueryName.Value);
            writer.WriteUInt16NetworkOrder((ushort)question.QuestionType);
            writer.WriteUInt16NetworkOrder((ushort)question.QuestionClass);

            /*
             +------------+--------------+------------------------------+
             | Field Name | Field Type   | Description                  |
             +------------+--------------+------------------------------+
             | NAME       | domain name  | MUST be 0 (root domain)      |
             | TYPE       | u_int16_t    | OPT (41)                     |
             | CLASS      | u_int16_t    | requester's UDP payload size |
             | TTL        | u_int32_t    | extended RCODE and flags     |
             | RDLEN      | u_int16_t    | length of all RDATA          |
             | RDATA      | octet stream | {attribute,value} pairs      |
             +------------+--------------+------------------------------+
             * */

            var opt = new OptRecord();

            writer.WriteHostName("");
            writer.WriteUInt16NetworkOrder((ushort)opt.RecordType);
            writer.WriteUInt16NetworkOrder((ushort)opt.RecordClass);
            writer.WriteUInt32NetworkOrder((ushort)opt.InitialTimeToLive);
            writer.WriteUInt16NetworkOrder(0);
        }
        public void WriteInt16NetworkOrder_should_write_value_in_the_data_array()
        {
            // Arrange.
            const short value = 45;

            // Act.

            writer.WriteInt16NetworkOrder(value);

            // not so 'Act'
            byte[] data = SubArray(writer.Data.Array, 0, writer.Data.Count);
            ArraySegment <byte> arrData = new ArraySegment <byte>(data);
            ushort result = Read(arrData); // (ushort)(ReadByte(arrData, 0) << 8 | ReadByte(arrData, 1));

            // Assert.
            Assert.AreEqual(value, result);
        }