C 解析DNS响应

C 解析DNS响应,c,network-programming,dns,C,Network Programming,Dns,我在解析DNS响应时遇到一些问题。下面是我的代码。以下是结构。我在printf()中遇到了一个分段错误,我正在尝试打印QNAME 说到C编程,我是一个相当业余的人,所以我不确定我到底出了什么问题。如有任何帮助/提示或链接到有用的资源/教程,将不胜感激。函数verfify_header()工作正常。我不确定为什么要使用memcpy()正确提取标题。其他领域则不然 struct HEADER{ unsigned short ID; unsigned char RD:1;

我在解析DNS响应时遇到一些问题。下面是我的代码。以下是结构。我在printf()中遇到了一个分段错误,我正在尝试打印QNAME

说到C编程,我是一个相当业余的人,所以我不确定我到底出了什么问题。如有任何帮助/提示或链接到有用的资源/教程,将不胜感激。函数verfify_header()工作正常。我不确定为什么要使用memcpy()正确提取标题。其他领域则不然

struct HEADER{    
  unsigned short ID;    
  unsigned char RD:1;    
  unsigned char TC:1;    
  unsigned char AA:1;    
  unsigned char Opcode:4;    
  unsigned char QR:1;    
  unsigned char RCODE:4;    
  unsigned char Z:3;    
  unsigned char RA:1;    
  unsigned short QDCOUNT;    
  unsigned short ANCOUNT;    
  unsigned short NSCOUNT;    
  unsigned short ARCOUNT;    
};

struct REQ_DATA{
 unsigned short qtype;
 unsigned short qclass;  
};

struct QUESTION{
  char* qname;
  struct REQ_DATA field;
};

struct RES_DATA{    
  unsigned short type;    
  unsigned short class;    
  unsigned int ttl;    
  unsigned short rdlength;    
};  

struct RESPONSE{
  char* name;    
  struct RES_DATA field;    
  char* rdata;    
};
以下是解析dns响应的函数

void parse_response(char *recvbuf, struct result *res)     
{   
  struct HEADER *rechd = (struct HEADER*) malloc(sizeof(struct HEADER));    
  struct QUESTION qst;    
  struct RESPONSE *rp = (struct RESPONSE*) malloc(sizeof(struct RESPONSE));    
  struct RES_DATA fld;

  char* rname = (char*)malloc(sizeof(char));    
  int hlen,qlen,rlen;   
  hlen = sizeof(struct HEADER);

  memcpy(rechd,recvbuf,hlen);

  verify_header(rechd);    //This function works correctly
  qlen = sizeof(struct QUESTION);

  //RESPONSE is after QUESTION and HEADER
  rlen = sizeof(struct RESPONSE);

  int length = hlen + qlen;
  rp = (struct RESPONSE*)(recvbuf + length);
 //memcpy(rp, recbbuf + length, sizeof(struct RESPONSE));

  memcpy(rname, rp, strlen(rname) + 1);

  printf("QNAME: %s\n", *rname);  //Segmentation Fault occurs over here!!!!!

}
谢谢,
Chander

问题是您试图使用C结构来解析网络上的数据。如果您的机器是big-endian,并且您的编译器碰巧按照您希望的顺序对位字段进行排序,那么这可能会正常工作(直到您找到指针字段…),但它非常脆弱。您应该将数据包解析为
无符号字符数组

现在,看看这个:

struct QUESTION{
  char* qname;
  struct REQ_DATA field;
};

这是一个8或16字节的结构(取决于您的平台),与实际DNS数据包中的可变长度字段完全不同。当然,你不可能从网络上的数据中得到一个有效的指针(它是你自己的机器和进程地址空间的本地指针)。

你不需要*on*rname,我得到的是一个空值。另外,我尝试在使用memcpy的地方使用memmove(),但结果仍然相同