【发布时间】:2015-11-01 10:01:52
【问题描述】:
我正在制作一个使用 pcap 解析 .pcap 文件的程序。
我实际上正在研究 DNS 协议,我能够获取标头并显示其信息。现在我想显示它的资源记录(问题、答案、权威、附加)。
我发现了这个有趣的文档:http://www.zytrax.com/books/dns/ch15/
而且,正如我之前解析不同标头所做的那样,我想创建一个结构并将我的数据包投射到其中。
按照这个文档,我创建了如下结构:
struct question_s {
u_short *qname;
u_short qtype;
u_short qclass;
}
我正在投射:
struct question_s *record = (struct question_s*)(data + offset);
其中data是数据包表示,offset是之前协议的总大小。
现在我无法理解某些要点,而且由于我的英语不完美,我可能遗漏了文档中的某些内容。以下是我的问题:
由于 qname 的大小可变,我是否通过将其设置为 u_short 上的指针来正确处理?
所有指针都是 8 字节长,所以我的结构应该是 12 字节长,但是内存中的名称在哪里?我是否应该在不考虑名称长度的情况下将 12 添加到我的偏移量?
我试图显示 qname,就好像它是一个 char* 一样处理它,但它似乎不起作用(段错误),这是我所做的:
void test(u_short *qname) {
for (int c = 0; qname[c] != 0; ++c)
write(1, &qname[c], 1);
}
但也许字符串中没有'\0'?
可能是字节序问题?我在所有 u_short 和 u_int 值上使用 htons 和 htonl,因为网络字节顺序与我的不同,但我不确定它是否适用于指针。
【问题讨论】: