Chinaunix首页 | 论坛 | 博客
  • 博客访问: 153809
  • 博文数量: 32
  • 博客积分: 2053
  • 博客等级: 大尉
  • 技术积分: 382
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-09 12:45
文章分类

全部博文(32)

文章存档

2011年(12)

2010年(20)

分类: LINUX

2011-01-23 12:33:51

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);


阅读(2924) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~