begin process at 2010 02 10 00:23:19
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

Réseau & Internet

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

mardi 23 mai 2006 à 14:49:14 | pb lors de l'envoie de donnée avec les sockets

poporiding

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.

mardi 23 mai 2006 à 16:00:57 | Re : pb lors de l'envoie de donnée avec les sockets

Bel0

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.
mercredi 24 mai 2006 à 12:07:05 | Re : pb lors de l'envoie de donnée avec les sockets

poporiding

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!!!
mercredi 24 mai 2006 à 16:11:02 | Re : pb lors de l'envoie de donnée avec les sockets

Bel0

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é.
mercredi 24 mai 2006 à 16:17:58 | Re : pb lors de l'envoie de donnée avec les sockets

Bel0

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
mercredi 24 mai 2006 à 17:35:38 | Re : pb lors de l'envoie de donnée avec les sockets

poporiding

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!!!!!!!
mercredi 24 mai 2006 à 17:38:12 | Re : pb lors de l'envoie de donnée avec les sockets

Bel0

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
vendredi 26 mai 2006 à 11:08:57 | Re : pb lors de l'envoie de donnée avec les sockets

poporiding

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?
vendredi 26 mai 2006 à 21:01:02 | Re : pb lors de l'envoie de donnée avec les sockets

Bel0

Si, je veux bien, mais je n'ai pas w2k. Je vais donc du mal à tester la chose.


Cette discussion est classée dans : icmp, ip, socket, bits, unsigned


Répondre à ce message

Sujets en rapport avec ce message

RAW SOCKET - IP - ICMP - Ping [ par dark1933 ] Salut à tous,Voici le code d'un programme qui envoye un ping (ici à Google), mais ne reçoit aucune réponse.La socket utilisée est du type : socket(AF_ RAW SOCKET - IP - Sendto() - Erreur 'WSAEADDRNOTAVAIL' [ par dark1933 ] Salut à tous,J'essaye désespérément d'envoyer un Ping en forgeant le datagramme IP adéquat.J'obtiens l'erreur "WSAEADDRNOTAVAIL" au moment de l'appel winsock raw socket ping icmp recv [ par 4aBestWord ] bonjour,j'ai repris un code source en c pour faire un un ping icmp en utilisant les raw sockets sous windows (XP). L'envoie du ping fontionne bien par socket RAW ICMP - fonctionnement et implémentation... [ par smirnoff69ice ] Salut, Je suis sur un projet et je dois simuler l'envoi de paquets ICMP sur le réseau. J'ai déjà fait un petit programme de test (repris en partie dep Thread socket icmp [ par ghanmi04_05 ] Bonjour j'ai un programme qui lance des threads de contrôle des interfaces réseaux disponible sur une machine quelconque(windows). Si je lance une fo Problème avec winpcap et visual studio 2005 [ par jnbrunet ] Bonjour, j'essai depuis quelques temps de réaliser un petit sniffer personnel. J'utilise visual studio 2005. J'ai installé correctement winpcap. Lorsq POINTEUR (C) sur plusieurs structures (0 Lectures) [ par skouby ] Bonjourje voulais essayer de réussir tout seul , ..mais mes yeux clignotent :SAlors je me met a vos pieds lolje programme un tachymetre en C avec SDCC Socket RAW IPPROTO_ICMP et thread [ par ags_squale ] Bonjour,J'essaie de développer un petit module qui 'pingue'  des équipements de manière simultanée. Je suis sous linux 2.6 - mandriva.Pour cela je lan Socket IP [ par Jeff_Trek ] Bonjour,J'aimerais savoir s'il y est possible de connaitre l'adresse IP d'un client qui se connecte (ou se déconnecte) à mon serveur (Socket IP).J'uti


Nos sponsors


Sondage...

Comparez les prix


HTC Hero

Entre 550€ et 550€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales