sebastienmz
Messages postés139Date d'inscriptionmardi 16 mai 2006StatutMembreDernière intervention23 juin 2008
-
11 mai 2007 à 09:55
emmatopiak
Messages postés149Date d'inscriptionmercredi 28 mars 2007StatutMembreDernière intervention17 mai 2007
-
12 mai 2007 à 14:15
Bonjours tlm
j'ai quelque petit problème je crée mon packet udp tout est bon saufe le checksum pouvez vous m'aider voici mon code:
#define PORT 521
#define buffer_size 2//5120
#define IP "192.168.2.1"
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;
emmatopiak
Messages postés149Date d'inscriptionmercredi 28 mars 2007StatutMembreDernière intervention17 mai 20072 12 mai 2007 à 14:15
Salut,
Bon trois choses à dire là.
1) essaye de passer sum en unsigned int
2) essaye de tester sur des paquets de longueur paire dans un premier temps, le dernier char est toujours etrange a tester
3) essaye aussi de voir dans les sources du noyau quelle est la fonction de calcul exacte
et une autre :p
4) sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
Sur ces deux ligne la, utilise une variable intermediaire dans un premier temps pour recuperer la partie 16bits gauche et la partie 15bits droite de sum.