IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Socket, rien ne part et rien pour m'indiquer que rien ne part!


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 59
    Points
    59
    Par défaut Socket, rien ne part et rien pour m'indiquer que rien ne part!
    bonjour tout le monde,

    j'ai un problème de compréhension. j'utilise les raw socket pour forger mes paquet ICMP et les envoyé au travers du réseau.

    Quand je débeug mon programme, je constate que la création du socket, l'initialisation de WS2_32.DLL, l'initialisation de la socket avec setsockopt, et l'envoie se réalisent a la perfection ( le tout en mode débeug).

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    SOCKET socketRaw;
     
    // The WSAStartup function initiates use of WS2_32.DLL by a process.
    bool initWSA()
    {
    	bool tempo = true;
    	WSAData wsaData;
    	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    	 {
    		 tempo = false;
    	 }
    	 return tempo;
    }
     
    // The WSACleanup function terminates use of the WS2_32.DLL.
    void clearWSA()
    {
    	WSACleanup();
    }
     
    bool creat_Socket()
    {
    	bool tempo = true;
     
    	socketRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, 0);
    	if(socketRaw == INVALID_SOCKET)
    	{
    		tempo = false;
    	}
    	return tempo;
    }
     
    bool init_Socket()
    {
    	bool tempo = true;
    	int sockOpt = 1;
    	int result;
     
    	// IPPROTO_IP IP_HDRINCL ==> Indique que l'IP header doit etre fourni par des données externes
    	if((result = setsockopt(socketRaw, IPPROTO_IP, IP_HDRINCL, (char*)&sockOpt, sizeof(sockOpt))) == SOCKET_ERROR)
    	{
    		tempo = false;
    	}
    	return tempo;
    }
     
    bool send_Socket(struct sockaddr_in sock_info, IP * ip, ICMP * icmp)
    {
    	bool tempo = false;
    	int result;
     
    	char paquet[sizeof(ICMP) + sizeof(IP)]; //28 = sizeof(ICMP) + sizeof(IP)
     
    	createICMPpaquet(ip, icmp, paquet);
     
    	int t = sizeof(paquet);
     
    	result = sendto(socketRaw, paquet, sizeof(paquet), 0, (struct sockaddr *)&sock_info, sizeof(sock_info));
     
    	if(result != SOCKET_ERROR)
    	{
    		tempo = true;
    	}
     
    	return tempo;
    }
     
    void createICMPpaquet(IP *ip, ICMP *icmp, char * paquet)
    {
    	int icmpT = sizeof(*icmp);
    	int ipT = sizeof(*ip);
     
    	ZeroMemory(paquet, icmpT + ipT); //permet de remplir un bloc de mémoire avec des 0
    	memcpy(paquet, ip, ipT); 
    	paquet += ipT;
    	memcpy(paquet, icmp, icmpT);
    }
    mais rien n'est observé via un analyseur de trames

    D'ou peut venir un tel problème?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    D'un firewall ?

    Et aussi: Vérifie que result est bien égal à t (en plus d'être différent de SOCKET_ERROR).

    Enfin, je ne vois pas pourquoi ce ne serait pas égal...


    PS: Ça manque de const, tous ces pointeurs...

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 59
    Points
    59
    Par défaut
    pas de firewall, t est bien égal a result donc apparement le logiciel envoi bien le bon nombre d'octet.

    en ce qui concerne les constantes (ICMP et IP) on m'a dit de gérer le tout avec de pointeurs (c'est les seul pointeurs que j'utilise).

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Ce n'est pas ce que j'ai dit...
    Code C++ : 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
    31
    bool send_Socket(struct sockaddr_in sock_info, IP const * ip, ICMP const * icmp)
    {
    	bool tempo = false;
    	int result;
    
    	char paquet[sizeof(ICMP) + sizeof(IP)]; //28 = sizeof(ICMP) + sizeof(IP)
    
    	createICMPpaquet(ip, icmp, paquet);
    
    	int t = sizeof(paquet);
    
    	result = sendto(socketRaw, paquet, sizeof(paquet), 0, (struct sockaddr *)&sock_info, sizeof(sock_info));
    
    	if(result != SOCKET_ERROR)
    	{
    		tempo = true;
    	}
    
    	return tempo;
    }
    
    void createICMPpaquet(IP const * ip, ICMP const * icmp, char * paquet)
    {
    	int icmpT = sizeof(*icmp);
    	int ipT = sizeof(*ip);
    
    	ZeroMemory(paquet, icmpT + ipT); //permet de remplir un bloc de mémoire avec des 0
    	memcpy(paquet, ip, ipT); 
    	paquet += ipT;
    	memcpy(paquet, icmp, icmpT);
    }

    PS: Tu es en admin ?

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 59
    Points
    59
    Par défaut
    oui, je suis bien en admin.

    de plus j'initialise bien sockaddr_in avec mon adresse IP.

    un de mes programme similaire, avec le meme code marche parfaitement. la seul différence est que chaque valeur de mon entête IP et ICMP était rentré en dur. maitenant, c'est l'utilisateur qui initialise ces valeurs autravers d'une interface graphique.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Essaie en affichant les valeur en question + l'en-tête construit, et en comparant avec ce que tu obtenais en entrant les valeurs en dur...

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 59
    Points
    59
    Par défaut
    je viens de tester ce que tu m'as dit, et il n'y a pas de différence, le paquet a envoyer et identique mis a part certaine valeurs qui sont généré par le logiciel et par une fonction (pas créé par moi).

    de plus j'ai tester mon paquet créé en de lémontant afin de savoir s'il avait stocké les bonnes valeurs et la pas de problème non plus!

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 117
    Points : 61
    Points
    61
    Par défaut
    Je vais peut-être dire des bétises (car je ne connais pas trop les paquets ICMP) mais ils sont envoyé à qui ces paquets ?

    Parce que s'ils sont envoyés à localhost normal qu'ils passent pas par le réseau ...

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 59
    Points
    59
    Par défaut
    je souhaite les envoyer sur une ip qui est sur internet donc de ce coté la il n'y a pas de pb, tout devrait passer par ma carte réseau.

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Euh, la question qui tue : L'analyseur de trames, il est bien lancé sur le poste émetteur, c'est-à-dire à la source?

    Car sinon, il est possible que le programme émette le paquet mais que le système (ou autre chose) le bloque, etc.

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 59
    Points
    59
    Par défaut
    merci pour la question qui tue, mais oui ... ;-)

    et mon systeme ne bloque pas les paquets car comme je l'ai dit dans un autre post, un programme similaire réalisé par mes soins (traceroute) marche a la perfection sur ma machine ...

    donc comme mon autre programme marche, on peut en conclure que tous les prérequis pour faire marcher un prog avec les raw socket sont rempli a l'heure actuelle.

    cependant sur mon nouveau prog c'est une ilusion, ca marche au travers du débogeur, mais pas pour l'interface!!!

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Quand je débeug mon programme, je constate que la création du socket, l'initialisation de WS2_32.DLL, l'initialisation de la socket avec setsockopt, et l'envoie se réalisent a la perfection ( le tout en mode débeug).
    Salut,
    Peut-être que je me plante mais normalement l'initialisation de WS2_32.DLL doit se faire en tout premier, avant la création des sockets. Mais bon, le problème vient peut-être d'ailleurs ...

  13. #13
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 59
    Points
    59
    Par défaut
    c'est juste un ordre aléatoire sitant toutes les actions que je réalise

    Mais, oui, il faut dans un premiers temps initialiser WS2_32.DLL, puis créer ca socket, initialsier les option de cette socket et apres l'envoyer... mais meme dans cet ordre, ca ne marce pas!

    Quelqu'un aurait une idée, souhaiterais voir mon code (projet sous visual Studio .Net 2003)??

Discussions similaires

  1. [AC-2007] Mettre à jour une table alors que rien n'a été prévu pour cela
    Par tibofo dans le forum VBA Access
    Réponses: 4
    Dernier message: 14/04/2010, 11h33
  2. Réponses: 20
    Dernier message: 19/08/2009, 01h55
  3. Plus rien ne marche depuis l'installation de Apache. Que faire?
    Par frederix quest dans le forum ASP.NET
    Réponses: 4
    Dernier message: 31/03/2009, 11h40
  4. [MySQL] Probleme au niveau du code, j'ai l'impression que rien ne sort de la boucle WHILE.
    Par bilou95 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/12/2007, 14h51
  5. Réponses: 15
    Dernier message: 04/01/2007, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo