IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

programme en C pour tester la présence d'un service DNS


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 30
    Points : 18
    Points
    18
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 38
    Points : 42
    Points
    42
    Par défaut
    Est ce que tu as lu ceci ?

    http://abcdrfc.free.fr/rfc-vf/rfc1034.html

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    En quoi ça devrait m'aider?

Discussions similaires

  1. Réponses: 9
    Dernier message: 13/03/2012, 11h06
  2. Réponses: 2
    Dernier message: 03/03/2011, 16h27
  3. Réponses: 5
    Dernier message: 18/08/2010, 16h10
  4. script pour tester présence d'un processus
    Par sparowme dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 15/01/2009, 17h44
  5. Réponses: 3
    Dernier message: 30/01/2006, 10h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo