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 :

Checksum d'un packet udp


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Checksum d'un packet udp

    voila j'arrive a faire mes packets udp mais ce que je n'arrive pas a trouver c'est comment faire le checksum de la couche udp
    car juste envoyer le packet qui est pour 192.168.2.1:521 de moi -> 192.168.2.101:48605 sans données wireshark me dit le checksum du packet c'est
    ça fait 2 jours que j'essaye de faire cette somme de contrôle mais je n'y arrive pas! POUVEZ VOUS M'AIDER???

    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
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock.h>
    #include <errno.h>
     
    #define PORT 521
    #define IP "192.168.2.1"
    #define Source_IP "192.168.2.101"
    #define Source_Port 48605
     
     
    int winsock_err(int quit) {
      char    *error;
      char err_resu[2000];
      int l=0;
      l=WSAGetLastError();	
      switch(l) {
        case 10004: error = "Appel systeme interrompu"; break;
        case 10009: error = "Numero de fichier incorrect"; break;
        case 10013: error = "Permission refusee"; break;
        case 10014: error = "Adresse incorrecte"; break;
        case 10022: error = "Argument non valide"; break;
        case 10024: error = "Trop de fichiers ouverts"; break;
        case 10035: error = "L'operation serait bloquee"; break;
        case 10036: error = "Operation en cours. Cette erreur est renvoyee si une fonction d'API Windows Sockets est appelee alors qu'une fonction bloquante est en cours";break;
        case 10037: error = "Operation deja en cours"; break;
        case 10038: error = "Operation Socket sur non-socket"; break;
        case 10039: error = "Adresse de destination nécessaire"; break;
        case 10040: error = "Message trop long"; break;
        case 10041: error = "Type de protocole incorrect pour le socket"; break;
        case 10042: error = "Protocole non disponible"; break;
        case 10043: error = "Protocole non pris en charge"; break;
        case 10044: error = "Type de socket non pris en charge"; break;
        case 10045: error = "Opération non prise en charge sur le socket"; break;
        case 10046: error = "Famille de protocoles non prise en charge"; break;
        case 10047: error = "Famille d'adresses non prise en charge par la famille de protocoles"; break;
        case 10048: error = "Adresse deja en cours d'utilisation"; break;
        case 10049: error = "Impossible d'allouer l'adresse demandee"; break;
        case 10050: error = "Reseau hors service. Cette erreur peut etre signalée a tout moment si l'implementation Windows Sockets detecte un echec sous-jacent."; break;
        case 10051: error = "Le reseau n'est pas accessible"; break;
        case 10052: error = "Le reseau a abandonne la connexion lors de la reinitialisation"; break;
        case 10053: error = "Le logiciel a entraine l'abandon de la connexion"; break;
        case 10054: error = "Connexion reinitialisée par un poste"; break;
        case 10055: error = "Pas d'espace disponible dans la memoire tampon"; break;
        case 10056: error = "Le socket est deja connecte"; break;
        case 10057: error = "Le socket n'est pas connecte"; break;
        case 10058: error = "Envoi impossible après l'arrêt du socket"; break;
        case 10059: error = "Trop de références : impossible de raccorder"; break;
        case 10060: error = "Delai de connexion depasse"; break;
        case 10061: error = "Connexion refusee"; break;
        case 10062: error = "Trop de niveaux de liens symboliques"; break;
        case 10063: error = "Nom de fichier trop long"; break;
        case 10064: error = "Le serveur hôte ne fonctionne plus"; break;
        case 10065: error = "Pas d'itineraire pour le serveur hote"; break;
        case 10066: error = "Dossier n'est pas vide"; break;
        case 10067: error = "Trop de processus"; break;
        case 10068: error = "Trop d'utilisateurs"; break;
        case 10069: error = "Le Qouta du disc est depasse"; break;
        case 10070: error = "Stale NFS file handle"; break;
       	case 10071: error = "Too many levels of remote in path"; break;
        case 10091: error = "Renvoye par l'appel WSAStartup() ; indique que le sous-systeme du reseau est inutilisable"; break;
        case 10092: error = "Renvoye par l'appel WSAStartup() ; indique que les DLL de Windows Sockets ne peuvent pas prendre en charge cette application"; break;
        case 10093: error = "Winsock non initialise. Ce message est renvoye par n'importe quelle fonction à l'exception de l'appel WSAStartup() ; indique qu'un appel WSAStartup() reussi n'a pas encore ete realise"; break;
        case 10101: error = "Deconnexion"; break;
        case 11001: error = "Hôte introuvable. Ce message indique que la cle (nom, adresse, etc.) est introuvable"; break;
        case 11002: error = "Serveur hote non decisionnaire introuvable. Cette erreur pourrait indiquer que le service de nom lui-meme ne fonctionne pas"; break;
        case 11003: error = "Erreur non récupérable. Cette erreur peut indiquer que le service de nom lui-même ne fonctionne pas"; break;
        case 11004: error = "Nom valide, aucune donnée du type demande enregistree. Cette erreur indique que la cle (nom, adresse, etc.) est introuvable"; break;
        default: error ="Erreur inconnue"; break;
        }
     
        sprintf(err_resu, "[!]Erreur! Code : %d\n  %s", error);
        printf("\n%s\n",err_resu);
        system("pause");
        if (quit)
          exit(1);
        else 
          return l;
    } 
     
     
    typedef struct udphdr {
        unsigned short srcport;
        unsigned short dstport;
        unsigned short length;
        unsigned short checksum;
    } UDP_HDR;
     
     
     
     
    unsigned short in_cksum(u_short * addr, int len) {
      register int nleft = len;
      register u_short *w = addr;
      register int sum = 0;
     
      u_short answer = 0;
     
      while (nleft > 1) {
        sum += *w++;
    	nleft -= 2;
      }
      if (nleft == 1) {
        *(u_char *) (&answer) = *(u_char *) w;
    	sum += answer;
      }
      sum = (sum >> 16) + (sum & 0xffff);
      sum += (sum >> 16);
      answer = ~sum;
     
      return (answer);
    }
     
     
    int main(int argc, char *argv[]){ 
      printf("[+]initialisation des varibles");
      struct udphdr *udp;
      unsigned short sizeofPacket;
      char *packet = NULL, *ptr = NULL;
      int len_sin;        
      SOCKET sock;
      SOCKADDR_IN sin;
      WSADATA data;
      printf("   OK\n");
      printf("[+]WSAStartup");  
      if( (WSAStartup(MAKEWORD(2,0), &data)) != 0)
         winsock_err(1);    
       printf("   OK\n[+]Création du socket");
      if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP))==INVALID_SOCKET )
          winsock_err(1);   
     
      printf("   OK\n[+]Allocation mémoire");    
     
      udp = (struct udphdr *) malloc(sizeof(struct udphdr));
      memset(udp, 0x0, sizeof(struct udphdr));
     
      printf("   OK\n[+]Construction de la partie du packet UDP"); 
     
      udp->srcport = htons(Source_Port);
      udp->dstport = htons(PORT);
      udp->length  = htons(sizeof(struct udphdr));
      udp->checksum = 0;
     
      printf("   OK\n[+]Construction du packet"); 
      sizeofPacket = sizeof(struct udphdr);
      packet = (char *) malloc(sizeofPacket);
      memset(packet, 0x0, sizeofPacket);
      ZeroMemory(packet, sizeofPacket);
      ptr = packet;
      memcpy(ptr, udp, sizeof(struct udphdr));
      ptr += sizeof(struct udphdr);
     
      printf("   OK\n[+]Initialisation de la destination"); 
     
      sin.sin_family = AF_INET;
      sin.sin_addr.s_addr = inet_addr(IP);
      sin.sin_port=htons(PORT); 
      len_sin=sizeof(sin);
     
      printf("   OK\n[+]Envois des données"); 
     
      if (sendto(sock, packet, sizeofPacket, 0x0, (struct sockaddr *) &sin,len_sin) == SOCKET_ERROR)
          winsock_err(1); 
      printf("   OK\n[+]TOUT C'est bien deroule\n"); 
      closesocket(sock);              
      WSACleanup(); 
      system("PAUSE");	
      return 0;
    }

  2. #2
    Membre habitué Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Points : 185
    Points
    185
    Par défaut
    De memoire et sans regarder ton code (je peux donc me planter) ce que tu recois dans ta socket n'est jamais le datagramme complet, mais simplement le champ "DATA" de ce datagram. En conséquence tu obtiens un checksum different de ton sniffer qui lui analyse le datagram complet.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2006
    Messages : 134
    Points : 61
    Points
    61
    Par défaut
    il a raison

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    et en fait la fonction pour faire le checksum je doit le faire sur les donné (champ data) et pas sur tout le packet
    alors je croit que c'est tout DONC RESOLU

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Reception de packet UDP
    Par taquilla dans le forum C++Builder
    Réponses: 31
    Dernier message: 18/05/2012, 22h38
  2. IP de destination d'un packet UDP
    Par mazeth dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 11/01/2011, 08h56
  3. Comment connaitre la taille d'un packet UDP ?
    Par Djobird dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 16/07/2009, 16h58
  4. Problème de packet UDP avec les routeurs
    Par Thixomag dans le forum Développement
    Réponses: 16
    Dernier message: 11/11/2007, 20h38
  5. récupérer la taille d'un packet UDP
    Par beLz dans le forum Réseau
    Réponses: 17
    Dernier message: 07/03/2007, 11h50

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