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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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 ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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