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