programme en C pour tester la présence d'un service DNS
Bonjour,
J'ai un petit exercice à faire en programmation réseau ou j'aurais besoin d'un peu d'aide...
Voici l'énoncé:
1. Il est possible de former une requete DNS vide sous la forme d'un paquet UDP contenant 12 octets:
- les deux premiers octets forment un entier 16-bit servant de numero d'identification que l'on pourra ici choisir arbitrairement
- les dix octets suivant sont remplis de zéros
Ecrivez en C un programme permettant via l'envoi d'un tel paquet DNS de tester la présence d'un service DNS sur un serveur. Affichez et interprétez les 12 premiers octets de la réponse éventuelle en fonction du schéma suivant:
ID sur 16 bits
QR (1 bit) vaut 0 pour une requete 1 pour une réponse
OPCODE (4 bits) vaut 0
AA 1 bit
TC 1 bit
RD 1 bit
RA 1 bit
Z 3 bits
RCODE 4 bits
QDCOUNT 16 bits
ANCOUNT 16 bits
NSCOUNT 16 bits
ARCOUNT 16 bits
...
total = 12 octets
pour l'instant j'ai fais ça :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netbd.h>
int main (int argc, char **argv) {
struct sockaddr_in sockname;
struct hostent* hostname;
char host [] = "carbone";
int sock;
if ((hostname = gethostbyname (host)) == NULL) {
perror ("erreur resolution de nom");
exit (1);
}
if ((sock = socket (PF_INET, SOCK_DGRAM, 0)) < 0) {
perror ("erreur ouverture socket");
exit (1);
}
sockname.sin_family = AF_INET;
sockname.sin_port = htons (53);
memcpy (&sockname.sin_addr.s_addr, hostname->h_addr, hostname->h_length); |
Voila la base...
Maintenant on envoi le paquet UDP
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
char requete [12];
char reponse [12];
int i, r;
for (i = 0;i< 12;i++)
requete [i] = 0;
requete [0] = 6; // premier octet = nombre arbitraire (j'ai choisi 6)
requete [1] = 12; // deuxième octet = nombre arbitraire (j'ai choisi 12)
if ((r = sendto (sock, requete, 12, (struct sockaddr*)&sockname, sizeof (struct sockaddr_in)) < 0) {
perror ("erreur sendto");
exit (1);
} |
Est-ce bien ça qu'il fallait faire ??
Maintenant il faut récuperer la réponse du serveur avec recvfrom mais je ne vois pas trop comment faire pour interpreter la réponse...
En fait il faudrait interpréter chaque élément du tableau "reponse" en faisant des opérations binaires pour savoir quel bit est à un et lequel est à 0
Faut-il écrire une fonction unsigned lirebits (unsigned x, int p, int n) qui revoie les n premiers bits extraits de x à partir de la position p ?
Si vous pourriez me proposer un début de solution ç serait vraiment sympa merci d'avance...
D'autre part, je n'arrive pas à compiler des programmes avec l'argument -lsocket pour pouvoir utiliser la librairie sys/socket.h.
Quand je fais gcc -o no_fic nom_fic.c -lnsl -lresolv -lsocket j'ai une errue qui me dit que ld n'a pas pu trouver -lsocket !
Si je retire cet argument le programme compile mais ne marche pas...