Pb lors de l'envoie de donnée avec les sockets

poporiding Messages postés 23 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 juin 2006 - 23 mai 2006 à 14:49
Bel0 Messages postés 71 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 14 septembre 2007 - 26 mai 2006 à 21:01
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.


//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.


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.

8 réponses

Bel0 Messages postés 71 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 14 septembre 2007
23 mai 2006 à 16:00
Site de microsoft (MSDN):
WSAEINTR - 10004
Interrupted function call.
A blocking operation was interrupted by a call to WSACancelBlockingCall.
-> C'est consitant avec ce que je me rappelais d'avoir lu sur les changements de la stack IP sous XP. Il n'y a plus moyen d'envoyer de packet sur des sockets de type raw sous XP. Si on essaye, l'os empêche que l'appel système réussisse.

WSAEHOSTUNREACH - 10065
No route to host.
A socket operation was attempted to an unreachable host. See WSAENETUNREACH.
-> Sous w2k, c'est toujours possible il me semble. Si tu veux continuer, c'est sous cet OS qu'il faudra le faire. D'après l'erreur fournie, il s'agit peut-être d'un problème d'initialisation de l'adresse de destination du paquet. Vérifie un peu tout ça et si ca ne va toujours pas, copie le code ici et on jettera un coup d'oeil.
0
poporiding Messages postés 23 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 juin 2006
24 mai 2006 à 12:07
Merci Bel0 pour tes précision,


je viens de passer sous 2000 pro et la je compil et je lance mon programme. tout va bien (ou du moins on a l'impression)!!


quand j'analyse avec ethereal je me rend compte qu'il (le programme) ne prned pas les bonnes valeurs.


je me lance donc dans un degeugage et la je vois que quand je donne la valeur va a mon ip header, il le prend comme 4.


voila comment est déclarer le champ header lenght de mon entete ip qui est une strcuture:

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

    };


maniere dont je l'initialise :

struct IP_HEADER    ip;

ip.ip_hl = 20;


et quand je debeug je vois une valeur différente sur ce champ:

j'ai ip_hl      4'un carré'


je suis en pleine incompréhension!!!
0
Bel0 Messages postés 71 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 14 septembre 2007
24 mai 2006 à 16:11
Une chose me choque dans ce que tu écris. Tu dis que ip_hl est sur 4bits .. on est d'accord et puis tu essayes de stocké la valeur 20 dans ces 4 bits ... un petit problème sur 4 bits, on ne peut stocké que des valeurs de 0 à 15.

Je fais un peu de recherche, je posterais ici ce que j'ai trouvé.
0
Bel0 Messages postés 71 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 14 septembre 2007
24 mai 2006 à 16:17
Voilà la réponse !

La taille du paquet ip complet est donné BYTE et codé sur 16bits.

La taille du header est donné en mot de 32bits (en int si on veut). Comme un header ip standard fait 20bytes, tu dois mettre 5 comme taille (5*32 160bits 20bytes).

struct IP_HEADER ip;
ip.ip_v = 4;
ip.ip_hl = 5;

Le code hexa du char constitué de la version et de la taille du header doit donc être 0x45 ou 69 en base 10, c'est-à-dire le caractère 'E'.

Au passage, dans un header ip, on donne d'abord le numéro de version et ensuite la taille du header. N'oublies pas d'inverser ces deux champs dans ta structure !!

Belo
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
poporiding Messages postés 23 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 juin 2006
24 mai 2006 à 17:35
Tu avais raison pour la taille de l'ip Header, il fallait bien mettre
5, une erreur de ma part (une de plus).  cependant quand je lance
mon programme, j'ai toujours le meme problème!!!


Il initialise la taille de l'ip header a 16 et ethereal m'inidque le
message suivant : Bogus IP header length (16, must be at least 20)


j'ai bien modifié ma structure IP afin qu'elle coresponde a l'image
suivante :
http://zabra.l2ti.univ-paris13.fr/~fourmaux/meea/RTD7/img6.htm


mais aucun changement!


ah si avec ce code j'ai une IP version 5 sous ethereal!!!!!!!
0
Bel0 Messages postés 71 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 14 septembre 2007
24 mai 2006 à 17:38
Au passage, dans un header ip, on donne d'abord le numéro de version et ensuite la taille du header. N'oublies pas d'inverser ces deux champs dans ta structure !!

-> dernière phrase de mon post précédent :P
0
poporiding Messages postés 23 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 juin 2006
26 mai 2006 à 11:08
oui oui, j'avais bien vu, et j'ai bien fait la modification.


Mais ca n'a rien changé et en plus il me met une version d'ip bidon ... 5 par exemple


Je te remerci pour ta patience, et je voulais savoir si il n'y aurait pas moyen que tu regardes mon code?
0
Bel0 Messages postés 71 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 14 septembre 2007
26 mai 2006 à 21:01
Si, je veux bien, mais je n'ai pas w2k. Je vais donc du mal à tester la chose.
0
Rejoignez-nous