Checksum ip / tcp / udp .....

B0mbJacK Messages postés 141 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 25 octobre 2006 - 30 sept. 2006 à 21:32
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 1 oct. 2006 à 03:24
Bonjour à tous, j'ai besoin d'une fonction pour le checksum des entête ip /tcp et udp
Je trouve pas mal d'exemple mais c'est en C, C++
si kelkun à des connaissances en c, capable de me les convertir en vb, ca serai sympa

Voici un exemple de fonction permettant le calcul du checksum IP
unsigned short calcul_du_checksum(bool liberation, unsigned short *data, int taille)
    {
    unsigned long checksum=0;
    // ********************************************************
    // Complément à 1 de la somme des complément à 1 sur 16 bits
    // ********************************************************
    while(taille>1)
        {
        if (liberation==TRUE)
            liberation_du_jeton(); // Rend la main à la fenêtre principale
        checksum=checksum+*data++;
        taille=taille-sizeof(unsigned short);
        }

    if(taille)
        checksum=checksum+*(unsigned char*)data;

    checksum=(checksum>>16)+(checksum&0xffff);
    checksum=checksum+(checksum>>16);

    return (unsigned short)(~checksum);
    }

--------------------------------------------------------------------------------------------------

Voici un exemple de fonction permettant le calcul du checksum TCP. Elle est identique à celle de UDP.

struct pseudo_entete
    {
    unsigned long ip_source; // Adresse ip source
    unsigned long ip_destination; // Adresse ip destination
    char mbz; // Champs à 0
    char type; // Type de protocole (6->TCP et 17->UDP)
    unsigned short length; // htons( Taille de l'entete Pseudo + Entete TCP ou UDP + Data )
    };

unsigned short calcul_du_checksum(bool liberation, unsigned short *data, int taille)
    {
    unsigned long checksum=0;
    // ********************************************************
    // Complément à 1 de la somme des complément à 1 sur 16 bits
    // ********************************************************
    while(taille>1)
        {
        if (liberation==TRUE)
            liberation_du_jeton(); // Rend la main à la fenêtre principale
        checksum=checksum+*data++;
        taille=taille-sizeof(unsigned short);
        }

    if(taille)
        checksum=checksum+*(unsigned char*)data;

    checksum=(checksum>>16)+(checksum&0xffff);
    checksum=checksum+(checksum>>16);

    return (unsigned short)(~checksum);
    }

unsigned short calcul_du_checksum_tcp(bool liberation, unsigned long ip_source_tampon, unsigned long ip_destination_tampon, struct tcp tcp_tampon, char data_tampon[65535])
    {
    struct pseudo_entete pseudo_tcp;
    char tampon[65535];
    unsigned short checksum;

    // ********************************************************
    // Initialisation du checksum
    // ********************************************************
    tcp_tampon.checksum=0; // Doit être à 0 pour le calcul

    // ********************************************************
    // Le calcul du Checksum TCP (Idem à UDP)
    // ********************************************************
    // Le calcul passe par une pseudo entete TCP + l'entete TCP + les Data
    pseudo_tcp.ip_source=ip_source_tampon;
    pseudo_tcp.ip_destination=ip_destination_tampon;
    pseudo_tcp.mbz=0;
    pseudo_tcp.type=IPPROTO_TCP;
    pseudo_tcp.length=htons((unsigned short)(sizeof(struct tcp)+strlen(data_tampon)));
    memcpy(tampon,&pseudo_tcp,sizeof(pseudo_tcp));
    memcpy(tampon+sizeof(pseudo_tcp),&tcp_tampon,sizeof(struct tcp));
    memcpy(tampon+sizeof(pseudo_tcp)+sizeof(struct tcp),data_tampon,strlen(data_tampon));
    checksum=calcul_du_checksum(liberation,(unsigned short*)tampon,sizeof(pseudo_tcp)+sizeof(struct tcp)+strlen(data_tampon));

    return(checksum);
    }

Merci d'avance ... ^^

2 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
1 oct. 2006 à 03:22
Salut
Tu nous a dis de quoi tu avais besoin, on va te dire comment t'en passer.
Checksum : Somme de contrôle : Tu en as besoin pour qualifier un échange.
Pourquoi ne pas utiliser des outils modernes : le CRC ou CRC32 (éventuellement, CRC16)
C'est un Checksum qui tient compte de la position des bytes, plus efficace.
Seule condition : Il faut que tu maîtrise ces calculs des deux côtés pour les comparer.

Quelques sources à ce sujet sur vbfrance.
Pour le CRC32, tu pourrais utiliser la fonction intégrée à la DLL nommée ZLib qui sert à zipper/dézipper des fichiers. Il y a un contrôle de CRC dedans.
Suffit donc de placer cette DLL sous %Win%\System32 (c'est préférable) et d'utiliser la déclaration :
Private Declare Function Crc32 Lib "zlib.dll" Alias "crc32" (ByVal crc As Long, Buffer As Any, ByVal length As Long) As Long

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
1 oct. 2006 à 03:24
Rejoignez-nous