bonjour tout le monde.
Je me galère vraiment sur la création d'un programme qui envoie des socket en mode RAW.
j'ai un ensemble d'erreur, capturé avec WSAGetLastError(), et je ne comprend pas leur signification car c'est un nombre ==> 10065 (Windows 2000 sp4). note : le meme code exécuté sur un autre ordi me donne l'erreur 10004 (windows XP sp2) !!
Ces erreurs sont récupérées apres l'envoi d'un message via la socket (sendto());
voila un bout de code qui vous montrera comment je cré et déclare mes sockets.
pPaquet est une structure composée de deux autres structures formant l'entete IP et l'entete ICMP.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 //création de la socket SOCKET socketRaw; socketRaw = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); //initialisation de la socket int sockOpt = 1; setsockopt(socketRaw, IPPROTO_IP, IP_HDRINCL, (const char*)&sockOpt, sizeof(sockOpt)); //envoi de données sendto(socketRaw, (char *)pPaquet, dataSize, 0, (struct sockaddr *)&IP_sock_info, sizeof(IP_sock_info));
Si quelqu'un a une idée sur mon problème, je suis preneur. si vous souhaitez voir mon code plus en détail ou s'il n'y a pas assé de détails je suis à l'écoute.
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 struct IP_HEADER { unsigned char ip_hl:4; // 4 bits("Internet header lengh") représentant la taille de l'entête IP unsigned char ip_v:4; // ip_v la version (pour le moment version 4 de IP) unsigned char ip_tos; // "Type Of Service" est codé sur 8 bits. unsigned short ip_len; // Le champ Longueur totale est codé sur 16 bits et représente la longueur du paquet incluant l'entête IP et les Data associées unsigned short ip_id; // Le champ Identification est codé sur 16 bits et constitue l'identification utilisée pour reconstituer les différents fragments. unsigned short ip_off; // Codé sur ce bits cette valeur comporte le flag (3 bits indiquant l'état de la fragmentation) et le champ Position fragment (13 bits indiquant la position du fragment par rapport à la première trame) unsigned int ip_ttl; // Time To Live : la durée de vie du socket. unsigned int ip_proto; // Le protocol utilisé pour transporter les données. Peut être tcp(6), udp(17), icmp(1) unsigned short ip_sum; // Le checksum du datagram unsigned int ip_src; //Adresse IP source unsigned int ip_dst; // Adresse IP destination }; struct ICMP_HEADER { unsigned char icmp_type; // Permet d'identifier le type de message envoyé ou recu (0 = Echo Reply, 8 = Echo Request, 11 = TTL exceeded) unsigned char icmp_code; // Associé au champ type il représente la définition de message d'erreur. unsigned short icmp_cksum; // Le champ Checksum est codé sur 16 bits et représente la validité du paquet de la couche 3 ICMP unsigned short icmp_id; // 16 bits définissant lidentifiant de lémetteur unsigned short icmp_seq; // 16 bits permettant au récepteur didentifier si il manque un paquet }; struct ICMP_PAQUET { struct IP_HEADER ip; struct ICMP_HEADER icmp; };
merci d'avance.
Partager