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.

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));
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
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 l’identifiant de l’émetteur
        unsigned short        icmp_seq; // 16 bits permettant au récepteur d’identifier si il manque un paquet
    };
 
    struct ICMP_PAQUET
    {
        struct IP_HEADER    ip;
        struct ICMP_HEADER   icmp;
    };
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.

merci d'avance.