Paquet mal formé dans l’implémentation du client DNS

Bonjour pour le plaisir, je développe un petit client DNS sur un système Unix. J’ai lu la documentation sur le protocole DNS, j’ai écrit une toute petite fonction

int makeQuestion(char* dns_addr,char *name){ int s = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); register int len_name = strlen(name); if(s<0) return errno; struct sockaddr_in address; bzero(&address,sizeof(address)); address.sin_port = htons(53); address.sin_addr.s_addr = inet_addr(dns_addr); dns_header header; memset(&header,0,sizeof(dns_header)); header.id = htons(getpid()); header.q_count = htons(1); dns_question quest = { .qclass = htons(IN), .qtype = htons(A) }; register int pack_size = sizeof(dns_header)+len_name+2+sizeof(dns_question); char *packet = malloc(pack_size); memcpy(packet,&header,sizeof(dns_header)); for(int i = 0;i<len_name;i++) *(packet +i +sizeof(dns_header)) = name[i]; packet[len_name+sizeof(dns_header)] = '.'; packet[len_name+sizeof(dns_header)+1] = '\0'; memcpy(packet+sizeof(dns_header)+len_name+2,&quest,sizeof(dns_question)); sendto(s,packet,pack_size,NULL,&address,sizeof(address)); return OK; } 

La structure de l’en-tête DNS et de la requête DNS est déclarée comme suit:

 //DNS header structures typedef struct dns_header { uint16_t id; // identification number uint8_t rd :1; // recursion desired uint8_t tc :1; // truncated message uint8_t aa :1; // authoritive answer uint8_t opcode :4; // purpose of message uint8_t qr :1; // query/response flag uint8_t rcode :4; // response code uint8_t cd :1; // checking disabled uint8_t ad :1; // authenticated data uint8_t z :1; // its z! reserved uint8_t ra :1; // recursion available uint16_t q_count; // number of question ensortinges uint16_t ans_count; // number of answer ensortinges uint16_t auth_count; // number of authority ensortinges uint16_t add_count; // number of resource ensortinges }dns_header; typedef struct dns_question { uint16_t qtype; uint16_t qclass; }dns_question; 

Maintenant, j’ai exécuté le code alors que wireshark était en cours d’exécution et j’ai vu le paquet qui semblait être correct mais dans la section de requête wireshark a déclaré

 Name:  

La question est donc de savoir comment stocker le nom DNS de l’hôte interrogé dans le paquet ou si quelque chose ne va pas dans l’implémentation. Désolé pour la perte de temps et désolé pour mon anglais. Merci en effet

J’ai résolu finalement. Étudier mieux le protocoll (le système de noms de domaine) où la référence est à ce lien, la mauvaise partie était dans la section appelée qname (le nom de l’hôte que dans mon cas le protocoll ne pouvait pas déterminer la taille) le document dit qname est:

  a domain name represented as a sequence of labels, where each label consists of a length octet followed by that number of octets. The domain name terminates with the zero length octet for the null label of the root. Note that this field may be an odd number of octets; no padding is used. 

J’ai donc changé mon code pour transformer http://www.example.com en 3www7example3com et tout fonctionne