Checksum de packet udp incorrect HELP!!!

sebastienmz Messages postés 139 Date d'inscription mardi 16 mai 2006 Statut Membre Dernière intervention 23 juin 2008 - 11 mai 2007 à 09:55
emmatopiak Messages postés 149 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 17 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;

    return (answer);
}

 

int main(int argc, char *argv[]){

  unsigned short sizeofPacket;      char *packet NULL, *ptr NULL;
  int len_sin;
  SOCKET sock;
  SOCKADDR_IN sin;
  WSADATA data;
  struct udphdr *udp;
  if( (WSAStartup(MAKEWORD(2,0), &data)) != 0)
     winsock_err(1);   

  if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP))==INVALID_SOCKET )
      winsock_err(1);       
              
  sizeofPacket = sizeof(struct udphdr);  // sizeof(struct iphdr) +
 
  udp = (struct udphdr *) malloc(sizeof(struct udphdr));
 
  memset(udp, 0x0, sizeof(struct udphdr));
 
  udp->srcport = htons(48605); //port source
  udp->dstport = htons(521); //port dest
  udp->length = htons(sizeof(struct udphdr));
  udp->checksum = 0;
  udp->checksum = in_cksum((unsigned short *) udp, 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);
 
  sin.sin_addr.s_addr=inet_addr(IP);
  sin.sin_port=htons(PORT);
  sin.sin_family=AF_INET;
 
  len_sin=sizeof(sin);
 
  if (sendto(sock, packet, sizeofPacket, 0x0, (struct sockaddr *) &sin,len_sin) == SOCKET_ERROR)
      winsock_err(1);
  closesocket(sock);             
  WSACleanup();
  system("PAUSE");   
  return 0;
}

POUVEZ VOUS ->m'aider?
____
[www.sebastien-metthez.com www.sebastien-metthez.com]
le problème vient souvent de l'interface chaise clavier.

1 réponse

emmatopiak Messages postés 149 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 17 mai 2007 2
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.

Une autruche ne se cuit pas aux petits lardons.
0
Rejoignez-nous