C Programmation TCP Checksum

J'ai eu du mal à faire la somme de contrôle TCP depuis plusieurs jours maintenant. J'ai regardé de nombreuses sources sur Internet, mais aucun des exemples que j'ai vu de vous montrer comment faire le total de contrôle TCP. J'ai aussi regardé le RFC document et encore j'ai de la difficulté:

Ci-dessous c'est le code que j'utilise pour générer la somme de contrôle:

unsigned short checksum(unsigned short * buffer, int bytes)
{
    unsigned long sum = 0;
    unsigned short answer = 0;
    int i = bytes;
    while(i>0)
    {
            sum+=*buffer;
            buffer+=1;
            i-=2;
    }
    sum = (sum >> 16) + (sum & htonl(0x0000ffff));
    sum += (sum >> 16);
    return ~sum;
}

Cette fonction fonctionne pour la somme de contrôle IP.

Ci-dessous est la structure que j'ai fait pour mon en-tête TCP:

struct tcp_header
{
    unsigned short tcp_sprt;
    unsigned short tcp_dprt;
    unsigned int tcp_seq;
    unsigned int tcp_ack;
    unsigned char tcp_res:4;
    unsigned char tcp_off:4;
    unsigned char tcp_flags;
    unsigned short tcp_win;
    unsigned short tcp_csum;
    unsigned short tcp_urp;
};

J'ai été en utilisant Wireshark pour tester ces paquets et la seule chose de mal, c'est la somme de contrôle.

Enfin, voici le pseudo-en-tête struct que je charge avec l'en-tête TCP et de l'information de l'en-tête IP:

struct pseudoTcpHeader
{
    unsigned int ip_src;
    unsigned int ip_dst;
    unsigned char zero;//always zero
    unsigned char protocol;//= 6;//for tcp
    unsigned short tcp_len;
    struct tcp_header tcph;
};

Une fois que je charge cette structure avec les informations correctes j'utilise ensuite la fonction de la somme de contrôle sur l'ensemble de la pseudo-en-tête struct et affecter le total de contrôle TCP à cette valeur. Voyez-vous quelque chose de mal avec ce que j'ai fourni? Si le problème n'est pas ici, il peut être une mauvaise erreur que je ne peux pas voir.

Comment voulez-vous charger les informations dans les structures et d'où vient-elle?

OriginalL'auteur Hudson Worden | 2012-01-13