dns程序笔记
1.每种网络协议都有一种包的结构,设计一种好的结构体来表现包的结构是很重要的,不要在包的结构体中含有大小端问题,这个问题最好在接收和发送包的时候决定
2.经常使用位数组
3.进行比较时要明确双方的符号类型,不能进行无符号数和有符号数之间的比较
4.变长的部分使用指针,在构造时申请空间。多个变长的部分使用双重指针。这些空间都在包释放时进行释放。使用strdup复制字符串
//dns包
typedef struct
{
head h;
questions *q; //可有可无的都用指针,无时用NULL表示
record **answers; //变长的可有可无用双重指针
record **authority;
record **addition;
}packet;
|
5.进行分层处理,底层的数据包传输和业务逻辑区分,设计如下
//lovedns.c
char* getQuery(char *name);//由域名返回IP地址
//lovedns_dns_packet.c
//处理包
packet* createDNSPacket();
int freeDNSPacket(packet *p);
int sendDNSPacket(int sock, char *ip, packet *p);
packet* recvDNSPacket(int sock, int timeout);
//处理socket连接,虽然udp层有类似函数,但DNS还需要进行包装,进行严格的分层处理
int createDNSSocket();
int closeDNSSocket();
//lovedns_udp_packet.c
int createUDPSocket();
int closeUDPSocket();
int sendPacket(int sock, char *buf, int len, char *ip, int port);
int recvPacket(int sock, char *buf, int max, int timeout);
|
阅读(2932) | 评论(0) | 转发(0) |