Je rencontre des problèmes avec l'analyse de la réponse DNS. Voici mon code. Ce qui suit sont les structures. Je reçois une erreur de segmentation dans printf(), où j'essaie d'imprimer QNAME. Je suis assez amateur quand il s'agit de programmation en C, donc je ne sais pas vraiment où je vais mal. Toute aide/astuces ou lien vers des ressources/tutoriels utiles, sera appréciée. La fonction verfify_header() fonctionne correctement. Je ne suis pas sûr pourquoi HEADER est correctement extrait en utilisant memcpy(). et d'autres champs ne sont pas.Analyse de la réponse DNS
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;
};
Voici la fonction qui analyse la réponse 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!!!!!
}
Merci, Chander
Vous n'avez pas besoin du * on * rname –
Je reçois une valeur NULL. Aussi, j'ai essayé d'utiliser memmove() partout où j'utilise memcpy, mais toujours le même résultat –