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 :

Mini Sniffer sous Linux


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Avatar de Code Rom
    Homme Profil pro
    Cherche et essaie de corriger les bugs, ici ou là.
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Cherche et essaie de corriger les bugs, ici ou là.

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Par défaut Mini Sniffer sous Linux
    Salut,
    J'ai fait un mini sniffer sous Ubuntu.Et j'ai quelques questions.Je vous donne le code pour commencer, tout n'est pas encore finit (notamment pour les en tête TCP).

    Headers.h : Vous pouvez me dire si les commentaires sont correct, car j'essaye de réecrire a ma façon la signification de chaque champs.
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #ifndef HEADERS_H_INCLUDED
    #define HEADER_H_INCLUDED
     
    /** En-tête IP **/
    typedef struct ipheader
    {
        unsigned char   iph_ver;      /** version IP (4) **/
        unsigned char   iph_tos;      /** type of service **/
        unsigned short  iph_totlen;  /** total Lenght **/
        unsigned short  iph_id;      /** identification du paquet en cas de fragmentation **/
        unsigned short  iph_off;     /** offset, Numéro des fragments d'un paquet **/
        unsigned char   iph_ttl;      /** time to live, décrémenter a haque passage d'un routeur **/
        unsigned char   iph_protocol; /** Type de protocol assicier a l'enttête IP **/
        unsigned short  iph_sum;     /** checksum, sert a vérifier la validité du paquet **/
        unsigned short  iph_srcAddr; /** Addresse Source **/
        unsigned short  iph_dtsAddr; /** Adresse de destination **/
    } IPHDR;
     
    /**********************************************************************************************************/
     
    /** En tête ICMP **/
    typedef struct icmpheader
    {
        unsigned char   icmph_type;         /** Type et code represente l'erreur renvoyer par ICMP **/
        unsigned char   icmph_code;
        unsigned short  icmp_sum;           /** checksum, vérifie la validité du paquet ICMP **/
        unsigned short  icmph_id;           /** Identification, définit l'émétteur.Conseillez de mettre le PID de l'application utilisée **/
        unsigned short  icmph_seq;          /** Séquence, numéro des paquet afin de vérifie si il y a ueu pertes **/
        unsigned long   icmph_timestamp;    /**  ???????? **/
    } ICMPHDR;
     
    /************************************************************************************************************/
     
    /** En tête UDP **/
    typedef struct udpheader
    {
        unsigned short udph_srcport;    /** Port source **/
        unsigned short udph_dstport;    /** Port de destination **/
        unsigned short udph_len;        /** Longueur de l'entête udp + longueur des données **/
        unsigned short udph_sum;        /** checksum, Validité des paquet udp **/
    } UDPHDR;
     
    /*************************************************************************************************************/
     
    /** En tête TCP **/
    typedef struct tcpheader
    {
        unsigned short tcph_srcport;    /** Port source **/
        unsigned short tcph_dstport;    /** Port destination **/
        unsigned int tcph_seqnum;       /** sequence number, définit le N° du paquet**/
        unsigned int tcph_acknum;       /** Numéro d'aquitement, valide la réceptiuon d'un paquet.exple acknum = 10, signifie que tous les paquet < 10 on était reçut . **/
        unsigned char tcph_unused;      /** Champ réservé pour le futur, mit a 0 car pas utilisé pour le moment . **/
        unsigned char tcph_off;         /** Offset, Nombre de mots de 32 bits dans l'entête TC.Cad q'uil définit ou les données commencent **/
        unsigned char tcph_flag;        /** Flags, ACK, SYN, URG ect... **/
     
    #define FL_FIN  0x01
    #define FL_SYN  0X02
    #define FL_RST  0X04
    #define FL_PSH  0X08
    #define FL_ACK  0x10
    #define FL_URG  0X20
    #define FL_ECE  0x40
    #define FL_CWR  0x80
     
        unsigned short tcph_win;        /** Windows, nbre d'octets a partir du N° de séquence que le récepteur est capable de recevoir . **/
        unsigned short tcph_sum;        /** checksum, validité des paquet tcp **/
        unsigned short tcph_urg;        /** Pointer sur un poaquet de donnée urgent, donne sa position avec le décalage par rapport au N° de sequence **/
    } TCPHDR;
     
    #endif
    main.c : faite pas attention au ligne commentées, c'est juste por moi.
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    /* #include <sys/types.h>    */
    /* #include <sys/socket.h>   */
    /* #include <netinet/in.h>   */
    /* #include <net/ethernet.h> */
     
    #include <unistd.h>             /** pour sleep() **/
    #include <arpa/inet.h>          /** PF_PACKET, SOCK_RAW, htons(), inet_ntoa(), IPPROTO_xxx **/
    #include <netpacket/packet.h>   /** struct sockaddr_ll **/
    #include <linux/if_ether.h>     /** ETH_P_ALL **/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #include "Headers.h"
     
    /** - pourquoi pas de bind
        -  pourquoi cast en int pour header ip et icmp ***/
     
     
    int main(void)
    {
        int sockfd;
        int recvret = 0;
        char packet[8192];
        char addrIP[16];
        struct sockaddr_ll sin;
        socklen_t serverLen = sizeof(sin);
     
        /* int one = 1             ; */
        /* const int *val = &one   ; */
        /* char addrIP[16]         ; */
     
        /*strncpy(addrIP, "192.168.0.6", 16)      ;*/
     
        /** contexte d'adressage **/
        sin.sll_family      = PF_PACKET           ;
     
        if( (sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1)
        {
            perror("socket() : ");
            exit(1);
        }
     
        /*if( bind(sockfd, (struct sockaddr *)&sin, serverLen) == -1)
        {
            perror("bind() : ");
            exit(1);
        } */
     
        /** if( setsockopt(sockfd, "?????", )) pour le mode promiscuous **/
     
        /** pointers des protocoles **/
        IPHDR   *ip     = (IPHDR *)packet;
        ICMPHDR *icmp   = (ICMPHDR *)(sizeof(IPHDR) + packet);
        UDPHDR  *udp    = (UDPHDR *)(sizeof(IPHDR) + packet);
        TCPHDR  *tcp    = (TCPHDR *)(sizeof(IPHDR) + packet);
     
     
        /** Boucle infinit recvfrom() **/
        printf("Scan en cours :\n\n");
     
        while(1)
        {
            if( (recvret = recvfrom(sockfd, packet, sizeof(packet), 0, (struct sockaddr *)&sin, &serverLen) ) )
                sleep(1);
            else if(!recvret)
            {
                perror("recv() : ");
                exit(1);
            }
     
            /** Affichage infos IP **/
            printf("\t\t------NEW PACKET------\n\n");
            printf("\t\t------IP HEADER------\n\n");
     
            printf("TOS         : %d\n",    (int)ip->iph_tos);
            printf("Len         : %d\n",    ip->iph_totlen);
            printf("ID          : %d\n",    ip->iph_id);
            printf("OffSet      : %d\n",    ip->iph_off);
            printf("TTL         : %d\n",    (int)ip->iph_ttl);
            printf("Protocole   : %d\n",    (int)ip->iph_protocol);
            printf("Checksum    : %02x\n",  ip->iph_sum);
            printf("IP SRC      : %s\n",    inet_ntoa( ( *(struct in_addr *)&ip->iph_srcAddr) ) );
            printf("IP_DST      : %s\n",    inet_ntoa( ( *(struct in_addr *)&ip->iph_dtsAddr) ) );
            printf("-------------------------\n\n");
     
            /** Infos pour chaque protocole **/
     
            switch(ip->iph_protocol)
            {
                case IPPROTO_ICMP :
                {
                    printf("ICMP HEADER\n\n");
                    printf("Type        : %d\n",    (int)icmp->icmph_type);
                    printf("Code        : %d\n",    (int)icmp->icmph_code);
                    printf("Checksum    : %02x\n",  icmp->icmp_sum);
                    printf("ID          : %d\n",    (int)icmp->icmph_id);
                    printf("SeqNum      : %d\n",    (int)icmp->icmph_seq);
                    printf("timestamp   : %ld\n",   icmp->icmph_timestamp);
                    break;
                }
     
                case IPPROTO_UDP :
                {
                    printf("UDP HEADER\n\n");
                    printf("SRC Port    : %d\n",    (int)udp->udph_srcport);
                    printf("DST Port    : %d\n",    (int)udp->udph_dstport);
                    printf("Len         : %d\n",    (int)udp->udph_len);
                    printf("Checksum    : %02x\n",  udp->udph_sum);
                    break;
     
                }
     
                default :
                {
                    printf("Protocol Inconnu : %d\n", (int)ip->iph_protocol);
                    break;
                }
            }
     
            memset(packet, 0, sizeof(packet));
     
        }
     
        /** Swicth pour infos selon protocoles **/
     
        /** Bien faire memset a la fin de l loop **/
     
        return EXIT_SUCCESS;
    }
    Donc pour le moment 2 questions :

    1- pourquoi pas de bind() ? on utilise une structure sockadrr_ll ok, mais quelques explication serait le bien venu.

    2 - pourquoi des cast en int pour les headers ? en fait plus précisement, pour le default du swicth par exple.Dans le header IP, le type de protocol est un unsigned char, alors pourquoi il réclame un int lorsque je veut l'afficher ?

    Voila question peut être simple, mais bon il y a pas de question c..n je pense, donc autant les posées

    Merci bien, bon week end .

    A+++.

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    typedef struct ipheader
    {
    unsigned char iph_ver; /** version IP (4) **/
    unsigned char iph_tos; /** type of service **/
    ...
    }
    Les champs iph_ver et iph_tos doivent chacun avoir une taille de 4 bits. Là ils ont respectivement 8 bits. Ensuite il faut faire attention aux contraintes d'alignement également. Si tu ne veux pas te casser la tête pour ça, tu peux utiliser un truc similaire à #pragma pack(1) de Visual C++ par exemple. Tu as le même problème avec TCP. Tu peux trouver des en-têtes valide dans ce tutoriel.

    1- pourquoi pas de bind() ? on utilise une structure sockadrr_ll ok, mais quelques explication serait le bien venu.
    Moi aussi je suis surpris. En tout cas, je n'ai jamais entendu parler de serveur ou de sniffer sans bind. Pas sous Windows en tout cas.

    2- pourquoi des cast en int pour les headers ? en fait plus précisement, pour le default du swicth par exple.Dans le header IP, le type de protocol est un unsigned char, alors pourquoi il réclame un int lorsque je veut l'afficher ?
    un unsigned char est un entier sur 8 bits. Si tu veux afficher sa valeur entière avec printf, il faut mettre le code de conversion %d (int) ou %u (unsigned int) et caster ton unsigned char en int ou unsigned int parce que c'est requis par printf (%d / %u).

  3. #3
    Membre confirmé
    Avatar de Code Rom
    Homme Profil pro
    Cherche et essaie de corriger les bugs, ici ou là.
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Cherche et essaie de corriger les bugs, ici ou là.

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Par défaut
    Oulala je m'embrouille dans tous les sens, va falloir m'aider svp.
    Bon déja je recup pas les paquet ICMP, UDP ni TCP.Mais c'est pas le problème pour l'instant.

    Donc si j'ai bien compris (et c'est pas sur du tout !!), l'entête IP/TCP/UDP doit avoir une taille mutiple de 2 (2-4-8-16-32).
    Parce que quand je fait un sizeof(), sur mes structure IPHDR ect...j'obtiens :
    IPHDR = 16
    ICMPHDR = 16
    UDPHDR = 8
    TCPHDR = 20
    Avec cette structure TCP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef struct tcpheader
    {
        unsigned short tcph_srcport;    /** Port source **/
        unsigned short tcph_dstport;    /** Port destination **/
        unsigned int tcph_seqnum;       /** sequence number, définit le N° du paquet**/
        unsigned int tcph_acknum;       /** Numéro d'aquitement, valide la réceptiuon d'un paquet.exple acknum = 10, signifie que tous les paquet < 10 on était reçut . **/
        unsigned short tcph_unused : 6;      /** Champ réservé pour le futur, mit a 0 car pas utilisé pour le moment . **/
        unsigned short tcph_off : 4;         /** Offset, Nombre de mots de 32 bits dans l'entête TC.Cad q'uil définit ou les données commencent **/
        unsigned short tcph_flag : 6;    /** Flags, ACK, SYN, URG ect... **/
        unsigned short tcph_win;        /** Windows, nbre d'octets a partir du N° de séquence que le récepteur est capable de recevoir . **/
        unsigned short tcph_sum;        /** checksum, validité des paquet tcp **/
        unsigned short tcph_urg;        /** Pointer sur un poaquet de donnée urgent, donne sa position avec le décalage par rapport au N° de sequence **/
    } TCPHDR;
    Il y a donc un petit problème pour l'entête TCP.Mais du coup j'ai le droit de la modifier comme ça ? (unsigned int pour unused, off et flag), se qui fait 32 .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef struct tcpheader
    {
        unsigned short tcph_srcport;    /** Port source **/
        unsigned short tcph_dstport;    /** Port destination **/
        unsigned int tcph_seqnum;       /** sequence number, définit le N° du paquet**/
        unsigned int tcph_acknum;       /** Numéro d'aquitement, valide la réceptiuon d'un paquet.exple acknum = 10, signifie que tous les paquet < 10 on était reçut . **/
        unsigned int tcph_unused;      /** Champ réservé pour le futur, mit a 0 car pas utilisé pour le moment . **/
        unsigned int tcph_off;         /** Offset, Nombre de mots de 32 bits dans l'entête TC.Cad q'uil définit ou les données commencent **/
        unsigned int tcph_flag;    /** Flags, ACK, SYN, URG ect... **/
        unsigned short tcph_win;        /** Windows, nbre d'octets a partir du N° de séquence que le récepteur est capable de recevoir . **/
        unsigned short tcph_sum;        /** checksum, validité des paquet tcp **/
        unsigned short tcph_urg;        /** Pointer sur un poaquet de donnée urgent, donne sa position avec le décalage par rapport au N° de sequence **/
    } TCPHDR;
    Voila, sinon au sujet de bind(), je me suis aider de ce lien :
    http://www.cgsecurity.org/Articles/sniffer/index.html
    Je rejetterai un oeil plus tard.

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Voici un en-tête IP valide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef struct ipheader {
        UCHAR  hlen : 4, version : 4;
        UCHAR  tos;
        USHORT tot_len;
        USHORT id;
        USHORT offset : 13, flags : 3;
        UCHAR  ttl;
        UCHAR  protocole;
        USHORT somme;
        ULONG  ip_source;
        ULONG  ip_dest;
    } IPHEADER;
    Et un en-tête TCP valide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct tcpheader {
        USHORT port_source;
        USHORT port_dest;
        UINT   i_seq;
        UINT   i_ack;
        USHORT flags : 6, reserved : 6, offset : 4;
        USHORT fenetre;
        USHORT somme;
        USHORT urg_ptr;
    } TCPHEADER;
    Compare avec les tiens. Tu vois maintenant clairement tes erreurs ? Si tu ne vois pas la différence, je ne vois plus ce que je peux faire pour toi. Si tu vois la différence mais tu ne comprends pas pourquoi mes structures sont valides et les tiennes non valide, explicite le(s) point(s) que tu n'arrives pas à comprendre.

    A propos du bind, le document que tu cites ne dit pas qu'on n'en a pas besoin. Il ne propose même pas de code complet. Le bind n'est pas discuté parce que supposé connu de quelqu'un qui s'attaque à des raw sockets.

  5. #5
    Membre confirmé
    Avatar de Code Rom
    Homme Profil pro
    Cherche et essaie de corriger les bugs, ici ou là.
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Cherche et essaie de corriger les bugs, ici ou là.

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Par défaut
    Bah je vois que pour ton entête IP par exple : hlen et version sont déclaré sur la même ligne dans la structure, pareil pour offset et flags.
    Et quand je regarde le schéma de l'entête IP bah je vois que version et longeur forme le 1er octet, et que l'on ajoute l'offset au flags afin de complèter le 3ème et le quatrième octet.
    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
     0                   1                   2                   3   
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |Version|  IHL  |Type of Service|          Total Length         |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |         Identification        |Flags|      Fragment Offset    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |  Time to Live |    Protocol   |         Header Checksum       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                       Source Address                          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                    Destination Address                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                    Options                    |    Padding    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    Pour TCP c'est la même logique, offset + reserved + flags, et enfin en dessous Windows (dans la structure je parle), sa equivaut a completer la ligne du schéma de l'en tête TCP :
    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
       0                   1                   2                   3   
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |          Source Port          |       Destination Port        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                        Sequence Number                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                    Acknowledgment Number                      |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |  Data |           |U|A|P|R|S|F|                               |
       | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
       |       |           |G|K|H|T|N|N|                               |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |           Checksum            |         Urgent Pointer        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                    Options                    |    Padding    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                             data                              |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    Ma question est donc, concrètement sa change quoi dans une structure de déclarer plusieurs variables de même type sur une même ligne ?

    Sinon je lirait les RFC pour IP et TCP demain.

  6. #6
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Zut, sur les champs version et hlen j'ai mal regardé. En fait tu les as fusionné en un seul. J'ai pas fait attention. Néanmoins dans ton en-tête IP tu as déclaré les adresses source et destination USHORT (16 bits) alors qu'elles doivent être ULONG (32 bits). C'est tout ce qui ne va pas dans l'en-tête IP.

    Dans ton en-tête TCP, tant l'ordre des champs flag, unused et offset que leurs tailles que tu les attribues sont erronnés. C'est tout.

Discussions similaires

  1. Mini Projet en C (info disque dur) sous Linux
    Par exhortae dans le forum Linux
    Réponses: 8
    Dernier message: 21/11/2007, 14h41
  2. [Série] Accès au port série sous linux
    Par ghost dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 10/10/2007, 10h43
  3. Comment désinstaller MySQL sous linux
    Par nahmsath dans le forum Installation
    Réponses: 5
    Dernier message: 18/09/2007, 10h46
  4. Je ne peux établir une connexion cliente sous Linux.
    Par Anonymous dans le forum CORBA
    Réponses: 5
    Dernier message: 16/04/2002, 15h57

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