【发布时间】:2016-06-06 04:10:29
【问题描述】:
我正在编写一个 DNS 查询客户端,但无法理解我的数据是如何发送的以及如何使其正常工作。
在 Wireshark 中,我收到大量带有错误数据包警告的随机数据,并且我正在测试的 DNS 服务器没有响应。 (目前谷歌的DNS...8.8.8.8)
一个sn-p...
typedef struct DNS_HEADER {
// id to identify the request
int16_t id;
// query or response flag; default is 0
uint8_t qr :1;
// type of query; default is 0
uint8_t opcode :4;
// authoritative answer
uint8_t aa :1;
// message was truncated
uint8_t tc :1;
// recursion desired; default is yes
uint8_t rd :1;
// recursion available
uint8_t ra :1;
// unused
uint8_t z :1;
// response code
uint8_t rcode :4;
// entries in the question section; default is 1
uint16_t qdcount;
// resource records
uint16_t ancount;
// server resource records (in the authority section)
uint16_t nscount;
// resource records (in addl. section)
uint16_t arcount;
} dns_h;
header->qr = 0;
header->opcode = 0;
...
header->qdcount = htons(1);
...
还有我的发件人...
char buffer[sizeof(*header) * sizeof(*question) * 2];
int offset = 0;
memcpy(buffer, header, sizeof(*header));
offset += sizeof(*header);
memcpy(buffer + offset, question, sizeof(*question));
ssize_t sent = sendto(sock, buffer, sizeof(buffer), 0, (struct sockaddr *)addr, sizeof(*addr));
我做错了什么?这是通过套接字发送结构的推荐方法吗?我已将标题中的大多数字段设置为 0,而我设置为 1 的任何内容都使用了 htons
【问题讨论】:
-
嗯,首先,您发送的数据量是预期的两倍,而后半部分是未初始化的垃圾。
-
另外,你有 14 位的位域,所以编译器会插入额外的填充位,这可能不是你所期望的。