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
您的结构看起来不像我从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结构上.
希望这可以帮助...