C中的DNS客户端

Cha*_*ani 4 c sockets dns network-programming

我目前正在开展一个学校项目,要求我实现DNS客户端,而不使用任何库函数.

我已经到了发送DNS请求并收到回复的地步.我在解析回复时遇到了困难.我在char*数组中收到回复,我想将其转换为一些有意义的结构,我可以从中解析答案.我浏览了RFC并阅读了有关数据包结构的内容,但在C中实现它会给我带来麻烦.

任何人都可以用C语言给我任何例子,或者用任何其他语言来解释这是如何完成的.或者对书的任何引用也没关系.

额外细节:

所以,以下是我正在使用的结构.

struct result{
  int type;
  struct res_ip_cname ip_cname;
  struct res_error error;
  struct res_mx_ns mx_ns;
};

struct res_ip_cname{
  char* lst;
  int sec;
  char* auth_flag;
};

struct res_error{
  char * info;
};

struct res_mx_ns{
  char * name;
  unsigned short pref;
  int sec;
  char* auth_flag;
};
Run Code Online (Sandbox Code Playgroud)

我有一个char*buffer [],其中我存储了我从服务器收到的响应.并且,我需要从此缓冲区中提取信息并填充结构结果.

谢谢,Chander

Aln*_*tak 6

您的结构看起来不像我从RFC中识别的任何东西(是的,我已经编写了大量的DNS数据包解码软件).

看看RFC 1035特别-你最需要的,可以直接从外地布局映射结构的显示在其中.

例如,您需要一个标题(参见s4.1.1):

struct dns_header {
     uint16_t     query_id;
     uint16_t     flags;
     uint16_t     qdcount;
     uint16_t     ancount;
     uint16_t     nscount;
     uint16_t     arcount;
};
Run Code Online (Sandbox Code Playgroud)

不要忘记使用ntohs()这些字段的有线格式转换为机器的本机字节顺序.网络订单是大端的,现在大多数机器都是小端的.

您还需要一个"问题"结构(参见s4.1.2)和一个通用的"资源记录"结构(参见s4.1.3).

但请注意,这两种线的格式都以可变长度"标签" 开头,它也可以包含压缩指针(参见s4.1.4).这意味着在这些情况下,您无法将整个线块简单地映射到C结构上.

希望这可以帮助...