Pingicmp.exe
par _SebF

1 - Définition de l'exécutable
2 - Screen shot
        2.1 - Version console
        2.2 - Version graphique
3 - Download
4 - Suivi du développement de la version console
        4.1 - Problème restant
        4.2 - RoadMap
        4.3 - Suivi du projet
5 - Suivi du développement de la version Graphique
        5.1 - Problème restant
        5.2 - RoadMap
        5.3 - Suivi du projet
6 - Code source de la version console
        6.1 - pingicmp.cpp
7 - Code source de la version graphique
        7.1 - PingIcmp.h
        7.2 - PingIcmp.cpp
        7.3 - PingIcmpDlg.h
        7.4 - PingIcmpDlg.cpp
        7.5 - class_ip_address.h
        7.6 - class_ip_address.cpp
        7.7 - resource.h

1 - Définition de l'exécutable

L'utilitaire Ping permet à la base de  tester la présence d'un hôte distant via une trame de type ICMP. PingIcmp apporte les trois avantages suivants :

- Mesure du temps de réponse inférieur à la milliseconde.
- Changement d'adresse IP source.
- Envoi massif permettant d'atteindre des débits élevés tel que ~65 Mbps sur une carte 100 Mbps.

Posez vos questions, remarques, demande d'évolution et retour d'expérience sur le Forum dédié aux outils

2 - Screen shot

2.1 - Version console

TCPIP IPV6 VOIP VPN IP IPV4

2.2 - Version graphique

TCPIP IPV6 VOIP VPN IP IPV4

3 - Download

Nom : PingIcmp_gui.exe
Mode : Graphique
Version : 2.5
Librairie : Spécifique à PingIcmp
Taille : 1.456 Mo
Auteur : _SebF
Date de création : 29 Mars 2003
Dernière compilation : 08 Février 2004

Nom : PingIcmp.exe
Mode : Console
Version : 3.9
Librairie : Spécifique à PingIcmp
Taille : 0.132 Mo
Auteur : _SebF@FrameIP.com.pas.de.spam
Date de création : 21 Janvier 2003
Dernière compilation : 08 Février 2004

4 - Suivi du développement de la version console

4.1 - Problème restant

- Finir la traduction us.
- PingIcmp.exe /? émet un ping au lieu d'afficher l'exemple.

4.2 - RoadMap

- Intégration à la librairie commune.

4.3 - Suivi du projet

2004.02.08

V3.9

 - Séparation du suivit mode console et mode graphique. Recompilation avec le nouveau numéro de version.

2003.11.16

V3.9

 - Changement de l'email dans l'aide.
 - Remplacement de l'email par l'url www.frameip.com dans les data.
 - Changement de l'icône.

2003.05.08

V3.8

 - Migration du projet sur VC++ .net.
 - Desactivation de la librairie libcd grâce à la commande /NODEFAULTLIB:libcd.lib.
 - Changement des chemains statiques de la librairie socket.

2003.04.21

V3.8

 - Comparaison des arguments indépendamment des minuscules et majuscules grâce à la fonction strlwr.

2003.04.16

V3.7

 - Transformation du numéro de séquence avec htons() pour faire circuler dans les trames un numéro 1 2 3 4 ... au lieu de 256 512 768 1024 ...

2003.04.16

V3.7

 - Migration du projet en intégrant le pingicmp.h comme fichier de liaison.
 - Insertion du numéro de sequence.

2003.04.13

V3.6

 - Passage du retour de la fonction resolution_de_nom en unsigned long au lieu de int pour garder la compatibilité avec inet_addr.

2003.04.12

V3.6

 - Suppression de sous repertoire Debug afin que le resultat des compilations se trouve à la racine (Project - Setting - General).

2003.04.08

V3.5

 - Passage du debug en Level 4 et resolution des Warning de compilation C++.
 - Remplacement de clrscr par system("cls");
 - Rajout de (unsigned int) sur 5 strtod qui générés des warning.
 - Passage du mode Cmd de la valeur par defaut de la taille à 32.

2003.04.08

V3.4

 - Renomage de tous les .c en .cpp et recompilation de tous les modules en VC++ 6.0.

2003.03.30

V3.3

 - Modification de la fonction recuperation_ip_local() pour permettre de retourner la liste de toutes les ip locales.

2003.03.29

V3.2

 - Refonte de la procedure DNS afin d'intégrer le cas ou l'host demandé n'existe pas.
 - Modification des Data par mon adresse Email.

2003.03.19

V2.4

 - Modification de la fonction recuperation_ip_local pour lui intégrer le Return.

2003.01.30

V2.4

 - Intégration du numéro du process dans l'Id Icmp afin de le rendre unique sur cette machine.
Incrémentation de Séquence Icmp afin de différentier chaque paquet.

2003.01.29

V2.3

 - Résolution du problème de la perte de ping du au décalage dans le buffer. Pour cela j'ai crée la boucle sur un durée de timeout qui lit plusieurs fois le buffer afin de vérifier si la trame attendu n'est pas en seconde position voir plus.
 - Récupération de l'ip local dans la procédure initiation permettant de faire apparaître l'ip source par défaut qui sera utilisée.

2003.01.27

V2.2

 - Avancement de la documentation Icmp (inclus aux document IP).
 - Vérification que le paquet retour et bien pour celui attendu. Evitant le problème ou un retour de type host unresearchable était interprété comme le retour au ping.

2003.01.25

V2.1

 - Résolution du problème de temps de réponse. GetTickCount est approximatif de 10ms sous NT et 55 ms sous 9.x. J'ai inséré la fonction QueryPerformanceCounter qui se base sur le cycle du cpu.
 - Avancement de la documentation Icmp (inclus aux document IP).

2003.01.24

V2.0

 - Résolution du problème de la taille maximum de réception. 65000 maximum maintenant. Le problème été la valeur de 1024 dans la fonction RECV. Je l'ai passé à 65535.
 - 28 à l'affichage du nombre d'octets reçu afin d'indiquer la taille réel des data sans les entêtes.
 - Résolution du problème de RECV bloquant avec l'option SetSockOpt(...,SOL_SOCKET,SO_RCVTIMEO,...,...).
 - Ajout du paramètre timeout.
 - Le problème du temps de réponse vient du fait que la commande GetTickCount est approximative. Sous NT à 10 Ms et sous Win9x à 55 ms. Il ne reste plus qu'à trouver une solution.

2003.01.24

V1.3

 - Change de la boucle for en while.
 - Ajout du paramètre -t pour un bouclage bouclage_infinie.
 - Découverte d'un nouveau problème. Le ping ne fonctionne plus si un autre est en parallèle.
 - Essai d'incrémentation de id et seq dans l'entête ICMP, mais cela ne résout pas le problème.
 - Changement des array de 65000 à 65535 pour prendre le maximum de 2 octets.

2003.01.23

V1.2

 - Résolution du problème de montée en charge de la mémoire et du temps de réponse. En sortant la préparation des entêtes de la boucles.
 - Utilisation de la fonction inet_ntoa afin de transformer le numéro IP au format xxx.xxx.xxx.xxx.
 - Récupération de l'Ip source, attention sur un pc multi carte!
 - Avancement de la documentation Icmp (inclus aux document IP)

2003.01.22

V1.1

 - Dépannage de la réception de trame qui ne fonctionnait pas.
 - Ajout des options Nombre de fois et temps entre chaque ping.
 - Création de la documentation Icmp (inclus aux document IP).

2003.01.22

V1.0

 - Début du développement afin de créer un ping permettant de choisir l'ip source.
 - Copie du programme "Générateur de trames".
 - Mon arrière idée est de refaire le ping sans le nouveau bridage Microsoft -w 1.
 - Mon choix du compilateur s'est porté sur LCC 3.3 du au faite qu'il soit Light à installer.

5 - Suivi du développement de la version graphique

5.1 - Problème restant

- 2004.02.20 - Plantage de l'application lorsque le champs reception dépasse la déclaration de la variable char [100000], le mettre en cyclique.

5.2 - RoadMap

- Intégration à la librairie commune.

5.3 - Suivi du projet

2004.02.08

V2.5

 - Séparation du suivit mode console et mode graphique. Recompilation avec le nouveau numéro de version.

2003.11.16

V2.4

 - Changement de l'email dans l'aide.
 - Remplacement de l'email par l'url www.frameip.com dans les data.
 - Changement de l'icône.

2003.05.18

V2.3

 - Suppression de toutes les variables de types Values.
 - Passage de la compilation en mode Release.
 - Passage du SetSockOpt Recv dans la boucle.
 - Ajout des unités de mesures dans l'affichage de la fenêtres.

2003.05.17

V2.3

 - Passage de la procédure du PID parent dans la librairie.
 - Découverte que l'exe rend instantanément la main à la console permettant à l'utilisateur d'intéragir avec le cmd pendant l'execution de l'exe.
 - Suppression de la variable mode_windows qui n'a plus lieu d'être.

2003.05.14

V2.3

 - Ajout du readonly de timeout lors de la deselction de reception.
 - Test de performance à 45 Mps (P4 1,8Ghz).
 - Résolution du problème du pid de la console grâce aux commande FindWindow et GetWindowThreadProcessId.
 - Cela fonctionne même avec plusieurs cmd actifs. Le problème restant est l'attente de l'appuis d'une touche par l'utilisateur pour rendre la main..

2003.05.12

V2.3

 - J'ai réussit à écrire dans la console en l'attachant grâce à la commande AttachConsole(pid). Le problème est que j'ai pris le pid dans le gestionnaire des tâche!

2003.05.11

V2.3

 - Traduction en anglais des champs et de l'About.
 - Redimentionnement de la taille des objets et de la fanêtre.
 - Sélection par défaut des champs ip local et host name en fonction du Get appelant.
 - Affichage du TTL dans le milieu au lieu de la fin.

2003.05.11

V2.2

 - Ajout du champ IpAddressCtrl.
 - Déplacement du combobox dans la fenêtre ip_address.
 - Résolution du problème du champ Combobox qui ne s'ouvrait plus. Pour cela deux opérations. Le nettoyage des doublons de ressouce.h et l'edition notepad de PingIcmp.rc et remplacement des deux lignes du Combobox (attention aux coordonnées ???).
 - Création d'une variable externe permetant le dialogue entre deux ccp via la commande extern.

2003.05.10

V2.2

 - Création de la fenêtre ip_address afin de demander la saisie de l'adresse ip.

2003.05.08

V2.1

 - Migration du projet sur VC++ .net.
 - Desactivation de la librairie libcd grâce à la commande /NODEFAULTLIB:libcd.lib.
 - Changement des chemains statiques de la librairie socket.

2003.05.02

V2.0

 - Désactivation du spin nfois quand l'on passe en boucle infine.
 - Suppression de tous les répertoires et bascule de tous les fichiers dans le répertoire racine PingIcmp.
 - Renommage du fichier de suivi de projet avec un _ devant.

2003.05.01

V2.0

 - Intégration du modules gestion_des_arguments.

2003.05.01

V2.0

 - Refonte complète du programme pour n'intégrer qu'un seul Exe.
 - Convertion des sprintf en memcpy.
 - Intégration du module Pause afin de permettre de rendre la main à la fenetre principale pendant l'attente.

2003.04.27

V1.3

 - Remplacement des fonctions SetRange par SetRange32 afin de supporter 65535.

2003.04.26

V1.3

 - Déplacement des fichiers icône de /res à la racine.

2003.04.26

V1.3

 - Activation du menu about.
 - Création du bouton About.
 - Affichage de la fenetre About avec réccupération des informations dans la librairie.

2003.04.25

V1.2

 - Affectation des raccourcits clavier.

2003.04.25

V1.1

 - Réglage du problème des nouveaux Spins dont leurs valeurs ne varié que de -1 à 1. Pour cela passage de la limite max de 65535 à 10000.

2003.04.24

V1.1

 - Resolution du problème des Spins qui ne marchaient plus. Pour les associer à au champ désirer, il faut qu'ils se suivent dans l'ordre des tabulations.

2003.04.23

V1.1

 - Ajout de la procédure liberation_du_jeton qui permet de continuer à gérer la fenêtre principale pendant la boucle Ping.
 - Ajout du bouton Stop afin de pouvoir stoper la boucle.
 - Desactivation du bouton Ping pendant l'execution afin de marquer si l'on se trouve dans la boucle ou pas.
 - Activation de la procédure OnClose afin de fermer la boucle pour éviter que le process tourne en mémoire sans interface graphique.

2003.04.23

V1.0

 - Erreur docteur waston lors de la fermeture de la fenetre. Passage de la commande exit(0) en //.

2003.04.16

V1.0

 - Transformation du numéro de séquence avec htons() pour faire circuler dans les trames un numéro 1 2 3 4 ... au lieu de 256 512 768 1024 ...

2003.04.13

V1.0

 - Passage du retour de la fonction resolution_de_nom en unsigned long au lieu de int pour garder la compatibilité avec inet_addr.

2003.04.12

V1.0

 - Suppression de sous repertoire Debug afin que le resultat des compilations se trouve à la racine (Project - Setting - General).

2003.04.11

V1.0

 - Acivation de l'icône dans la fenetre minimize et dans le haut à gauche. Pour ce dernier, l'objet de l'icône doit s'appeler IDR_MAINFRAME.
 - Gestion de l'ordre des tabulation grace au menu Layout -> Tab order (Il faut au préalable avoir la Form).
 - Activation du bouton Ping comme bouton par defaut (dans les properties du bouton).

2003.04.08

V1.0

 - Passage du debug en Level 4 et resolution des Warning de compilation C++.
 - Remplacement de #include <tcconio.h> par #include <windows.h>.
 - Rajout de (unsigned int) sur 5 strtod qui générés des warning.
 - Passage de la decente du croll de 100 à 100000.

2003.04.08

V1.0

 - Renomage de tous les .c en .cpp et recompilation de tous les modules en VC++ 6.0.

2003.03.29

V1.0

 - J'ai séparé le programme en deux parties. L'une pour le coeur et l'autre pour l'intérface.
 - Intégration d'un frontal graphique à l'aide de VC++ 6.0.

6 - Code source de la version console

6.1 - pingicmp.cpp

// ********************************************************
// Les includes
// ********************************************************
#include <stdio.h>
//#include <tcconio.h>  // Pour Lcc
#include <windows.h> // Pour VC++
//#include <C:\\lcc\\projects\\PingIcmp\\Lib\\pingicmp.h>
#include <C:\\RepPerso\\Personnel\\Developpement\\Projets\\PingIcmp\\Lib\\pingicmp.h>


// ********************************************************
// Les procédures
// ********************************************************
void initiation_des_variables(void);
void gestion_des_arguments(int argc, char* argv[]);
void affichage_du_resultat();

// ********************************************************
// Les variables
// ********************************************************
struct echange echange_reception;
char ip_source[1000];
char ip_destination[1000];
unsigned char valeur_du_ttl;
unsigned int taille;
unsigned int nombre_de_ping;
bool bouclage_infinie;
unsigned int pause_entre_chaque_ping;
unsigned int timeout;
unsigned short sequence;







int main (int argc, char* argv[])
            {
            // system("cls");
            initiation_des_variables();
            gestion_des_arguments(argc,argv);
            while (nombre_de_ping>0) // Boucle du nombre de ping à envoyer
                        {
                        echange_reception=pingicmp_main(resolution_de_nom(ip_source), resolution_de_nom(ip_destination),valeur_du_ttl, taille,timeout,sequence);
                        if (sequence==65535) // Incrémente le champ sequence         
                                   sequence=0;
                        else
                                   sequence++;
                        affichage_du_resultat();
                        if (bouclage_infinie==TRUE)
                                   nombre_de_ping=1;
                        else
                                   nombre_de_ping--;
                        if (nombre_de_ping>0)
                                   Sleep(pause_entre_chaque_ping);
                        }
            printf("\n");
            return(1);
            }












void initiation_des_variables(void)
            {
            struct structure_ip_local reception_des_ip_locales;
            struct structure_version version_reception;
            int i;

            reception_des_ip_locales=recuperation_ip_local();
            strcpy(ip_source,reception_des_ip_locales.adresse_ip_local[0]);
            strcpy(ip_destination,"217.12.3.11");
            valeur_du_ttl=100;
            taille=32;
            nombre_de_ping=1;
            bouclage_infinie=FALSE;
            pause_entre_chaque_ping=1000;
            timeout=2;
            sequence=1;

            // ********************************************************
            // Affichage de la banniere
            // ********************************************************
            version_reception=version();
            printf("\n");
            for (i=0;i<version_reception.nombre_d_element;i++)
                        printf("\n%s",version_reception.tableau[i]);
            printf("\n\n");
            }












void gestion_des_arguments(int argc,char* argv[])
            {
            char * caractere_non_convertit;
            int i;

            if ( (argc>1) && (strcmp(argv[1],"-?")==0) || (argc==1) )
                        {
                        printf("\nParametres        Descriptions                  Valeurs par defaut");
                        printf("\n");
                        printf("\n-?                Aide");
                        printf("\n-ip_source        @Ip ou nom d'hote.            %s",ip_source);
                        printf("\n-ip_destination   @Ip ou nom d'hote.            %s",ip_destination);
                        printf("\n-ttl              Entre 0 et 255.               %d",valeur_du_ttl);
                        printf("\n-taille           Entre 0 et 65535.             %d",taille);
                        printf("\n-nfois            Entre 1 et 65535.             %d",nombre_de_ping);
                        printf("\n-t                Bouclage inifie");
                        printf("\n-pause            Temps entre les ping (ms).    %d",pause_entre_chaque_ping);
                        printf("\n-timeout          Temps d'attente max (s).      %d (0 supprime la reception)",timeout);
                        printf("\n\nExemple           pingicmp -ip_destination www.cisco.com -nfois 3");
                        printf("\n\n");
                        exit(0);
                        }
            for (i=1;i<argc;i=i+1)
                        {
                        if (strcmp(strlwr(argv[i]),"-ip_source")==0)
                                   strcpy(ip_source,argv[i+1]);
                        if (strcmp(strlwr(argv[i]),"-ip_destination")==0)
                                   strcpy(ip_destination,argv[i+1]);
                        if (strcmp(strlwr(argv[i]),"-ttl")==0)
                                   valeur_du_ttl=(unsigned char)strtod(argv[i+1],&caractere_non_convertit);
                        if (strcmp(strlwr(argv[i]),"-taille")==0)
                                   taille=(unsigned int)strtod(argv[i+1],&caractere_non_convertit);
                        if (strcmp(strlwr(argv[i]),"-nfois")==0)
                                   nombre_de_ping=(unsigned int)strtod(argv[i+1],&caractere_non_convertit);
                        if (strcmp(strlwr(argv[i]),"-t")==0)
                                   bouclage_infinie=1;
                        if (strcmp(strlwr(argv[i]),"-pause")==0)
                                   pause_entre_chaque_ping=(unsigned int)strtod(argv[i+1],&caractere_non_convertit);
                        if (strcmp(strlwr(argv[i]),"-timeout")==0)
                                   timeout=(unsigned int)strtod(argv[i+1],&caractere_non_convertit);
                        }
            }










void affichage_du_resultat(void)
            {
            if (echange_reception.nombre_de_caractere_emis==-1)
                        printf("\nLa trame n'a pas pu etre emise");
            else
                        {
                        if (echange_reception.nombre_de_caractere_recu==-1)
                                   printf("\nLa trame retour attendu n'a pas ete receptionnee");
                        if (echange_reception.nombre_de_caractere_recu>0)
                                   {
                                   printf("\n");
                                   if (sequence==0)
                                               printf("65535");
                                   else
                                               printf("%d",sequence-1);
                                   printf("   %s",echange_reception.ip_source);
                                   printf("   %s",echange_reception.ip_destination);
                                   printf("   %d Octets",echange_reception.nombre_de_caractere_recu-28);
                                   printf("   %.2f ms",echange_reception.temps_de_reponse);
                                   printf("   ttl : %d",echange_reception.ttl);
                                   }
                        }
            }

7 - Code source de la version graphique

7.1 - PingIcmp.h

// PingIcmp.h : main header file for the PINGICMP application
//

#if !defined(AFX_PINGICMP_H__591893E0_9BC7_4367_B6AF_F50CF282FA4C__INCLUDED_)
#define AFX_PINGICMP_H__591893E0_9BC7_4367_B6AF_F50CF282FA4C__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#ifndef __AFXWIN_H__
            #error include 'stdafx.h' before including this file for PCH
#endif

#include "resource.h"               // main symbols

/////////////////////////////////////////////////////////////////////////////
// CPingIcmpApp:
// See PingIcmp.cpp for the implementation of this class
//

class CPingIcmpApp : public CWinApp
{
public:
            CPingIcmpApp();

// Overrides
            // ClassWizard generated virtual function overrides
            //{{AFX_VIRTUAL(CPingIcmpApp)
            public:
            virtual BOOL InitInstance();
            //}}AFX_VIRTUAL

// Implementation

            //{{AFX_MSG(CPingIcmpApp)
            //}}AFX_MSG
            DECLARE_MESSAGE_MAP()
};


/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_PINGICMP_H__591893E0_9BC7_4367_B6AF_F50CF282FA4C__INCLUDED_)

7.2 - PingIcmp.cpp

#include "stdafx.h"
#include "PingIcmp.h"
#include "PingIcmpDlg.h"
#include "class_ip_address.h"
#include <C:\\RepPerso\\Personnel\\Developpement\\Projets\\LibrairieSocket\\LibrairieSocket.h>

// **************************************************
// CPingIcmpApp
// **************************************************
BEGIN_MESSAGE_MAP(CPingIcmpApp, CWinApp)
            ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

// **************************************************
// CPingIcmpApp construction
// **************************************************
CPingIcmpApp::CPingIcmpApp()
            {
            }

// **************************************************
// The one and only CPingIcmpApp object
// **************************************************
CPingIcmpApp theApp;

// **************************************************
// CPingIcmpApp initialization
// **************************************************
BOOL CPingIcmpApp::InitInstance()
            {
/*         struct gestion_des_arguments arguments;
 
            // **************************************************
            // Récupération des arguments
            // **************************************************
            arguments=recuperation_des_arguments(TRUE);

            if(arguments.argc==1)
            // **************************************************
            // Gestion en mode graphique
            // **************************************************
                        {
*/                     CPingIcmpDlg application;
                        m_pMainWnd = &application;
                        application.DoModal();
/*                     }
            else
            // **************************************************
            // Gestion en mode console
            // **************************************************
                        {
                        FILE *console_canal;

                        // **************************************************
                        // S'attache à la console qui a lancé le programme
                        // **************************************************
                        AttachConsole(pid_de_la_console_parente(FALSE));

                        // **************************************************
                        // Ouverture d'un canal vers cette console
                        // **************************************************
                        console_canal=_tfreopen(_T("CONOUT$"),"a",stdout);
                        _tfreopen(_T("CONIN$"),"r",stdin);
                        _tfreopen(_T("CONERR$"),"a",stderr);

// *************************
// Lecture du buffer
// *************************
INPUT_RECORD irInBuf[128];
DWORD cNumRead;
int error=999;
HANDLE hStdin,hStdin_flush;

hStdin_flush = GetStdHandle(STD_INPUT_HANDLE);
hStdin = GetStdHandle(STD_OUTPUT_HANDLE);
// printf("\nflush : %d",FlushConsoleInputBuffer(hStdin_flush));

// error=ReadConsoleInput(hStdin,irInBuf,128,&cNumRead);
error=ReadConsole(hStdin,irInBuf,2,NULL,NULL);

printf("\nerreur : %d",error);
printf("\nflush : %d",FlushConsoleInputBuffer(hStdin_flush));

                        // **************************************************
                        // Affichage
                        // **************************************************
                        printf("\nMode Console - Fontaine Sébastien");
                        printf("\n");


                        printf("\ntoto");
                        pause(true,5000);
                        printf("\ntiti");

//Vide le buffer avant de rendre la main
printf("\nflush : %d",FlushConsoleInputBuffer(hStdin_flush));
// lancer l'exe avec cmd /c pingicmp -t fonctionne bien surtout associé au dernier Flush

                        // **************************************************
                        // Fermeture du canal vers la console
                        // **************************************************
                        fclose(console_canal);

                        // **************************************************
                        // Détache la console
                        // **************************************************
                        FreeConsole();
                        }
*/
            return FALSE;
            }

7.3 - PingIcmpDlg.h

// PingIcmpDlg.h : header file
//

#include "afxwin.h"
#if !defined(AFX_PINGICMPDLG_H__894CE67F_4DDD_43D4_89DB_96DC735CC734__INCLUDED_)
#define AFX_PINGICMPDLG_H__894CE67F_4DDD_43D4_89DB_96DC735CC734__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

// ********************************************************
// Définition de la class CPingIcmpDlg
// ********************************************************
class CPingIcmpDlg : public CDialog
            {
            // standard constructor
            public : CPingIcmpDlg(CWnd* pParent = NULL);

            // Dialog Data
            //{{AFX_DATA(CPingIcmpDlg)
            enum { IDD = IDD_PINGICMP_DIALOG };
            CSpinButtonCtrl          m_spin_taille_control;
            CSpinButtonCtrl          m_spin_pause_control;
            CSpinButtonCtrl          m_spin_timeout_control;
            CSpinButtonCtrl          m_spin_nombre_de_fois_control;
            CSpinButtonCtrl          m_spin_ttl_control;
            CButton           m_button_ping_control;
            CEdit   m_edit_nombre_de_fois_control;
            CButton           m_check_boucle_control;
            CButton           m_check_reception_control;
            CEdit   m_edit_reception_control;
            //}}AFX_DATA

            // ClassWizard generated virtual function overrides
            // DDX/DDV support
            protected :       virtual void DoDataExchange(CDataExchange* pDX);
           
            // Implementation
            protected :       HICON m_hIcon;

            // **************************************************
            // Les fonctions
            // **************************************************
            void CPingIcmpDlg::fermeture_de_la_socket(void);
            void CPingIcmpDlg::recpetion(void);

            // Generated message map functions
            virtual BOOL OnInitDialog();
            afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
            afx_msg void OnPaint();
            afx_msg HCURSOR OnQueryDragIcon();
            afx_msg void On_check_boucle();
            afx_msg void On_button_ping();
            afx_msg void On_button_clear();
            afx_msg void On_button_stop();
            afx_msg void OnClose();
            afx_msg void On_button_about();
            afx_msg void On_Change_edit_ttl();
            afx_msg void On_Change_edit_nombre_de_fois();
            afx_msg void On_Change_edit_taille();
            afx_msg void On_Change_edit_ip_destination();
            afx_msg void On_Edit_change_combobox_ip_source();
            //}}AFX_MSG
            DECLARE_MESSAGE_MAP()
                        public : afx_msg void OnBn_Clicked_button_get_source();
                        public : afx_msg void OnBn_Clicked_button_get_destination();
           
                                  
                                                afx_msg void OnBn_Clicked_check_reception();
                                                CEdit m_edit_timeout_control;
                                                afx_msg void On_En_Change_edit_pause();
                                                afx_msg void OnEn_Change_edit_timeout();
                                                CEdit m_edit_ip_source_control;
                                                CEdit m_edit_ip_destination_control;
                                                CEdit m_edit_pause_control;
                                                CEdit m_edit_taille_control;
                                                CEdit m_edit_ttl_control;
                                                int m_edit_taille_range;
                                                int m_edit_ttl_range;
                                                int m_edit_pause_range;
                                                int m_edit_timeout_range;
                                                int m_edit_nombre_de_fois_range;
            };

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_PINGICMPDLG_H__894CE67F_4DDD_43D4_89DB_96DC735CC734__INCLUDED_)

7.4 - PingIcmpDlg.cpp

// 2003.03.01 - Fermer proprement les socket

// **************************************************
// Les include
// **************************************************
#include "stdafx.h"
#include "PingIcmp.h"
#include "PingIcmpDlg.h"
#include "class_ip_address.h"
#include "windows.h"
#include <C:\\RepPerso\\Personnel\\Developpement\\Projets\\LibrairieSocket\\LibrairieSocket.h>

// **************************************************
// Les variables
// **************************************************
struct ipv4 entete_ipv4_emission;         // Entête ip à émettre
struct icmp entete_icmp_emission;       // Entête icmp à émettre
struct ipv4 *entete_ipv4_reception;      // Entête ip recu
struct icmp *entete_icmp_reception;    // Entête icmp recu
LARGE_INTEGER cpu_frequence;                // Fréquence du CPU
LARGE_INTEGER temps_de_reponse1;       // Nombre de clock CPU avant l'envoi
LARGE_INTEGER temps_de_reponse2;       // Nombre de clock CPU après la reception
double temps_de_reponse;                  // Temps en ms entre réponse 1 et réponse 2
int nombre_de_caractere_emis;                       // Nombre de caracteres qui a été emis. -1 égale erreur
int nombre_de_caractere_recu;                       // Nombre de caracteres qui a été recus. -1 égale erreur
char data_reference[65535];               // Data de référence. Les data_a_envoye sera dimentionné par rapport à cette référence
char data_a_envoyer[65535];              // Les data qui seront emis
SOCKET id_de_la_socket;                            // Numéro de la socket obtenu
int numero_d_erreur;                           // Récuppère le numéro d'erreur WSAGetLastError();
//unsigned short m_edit_timeout;
unsigned short m_edit_timeout;
unsigned short m_edit_nombre_de_fois;
unsigned short nfois;                            // Permet de décompter la boucle sans modifer l'affichage de m_edit_nombre_de_fois
unsigned short m_edit_pause;
unsigned short m_edit_taille;
bool initialisation=FALSE;                   // Permet de savoir si la fenetre est présente ou pas

// **************************************************
// Les variables temporaires
// **************************************************
char tampon_char[65535];
int tampon_int;

// **************************************************
// Les variables externes permetant le dialogue entre les différents cpp
// **************************************************
extern DWORD class_ip_address_retour_de_fenetre; // Nombre Inet_addr retourné par l'utilisateur
extern BOOL class_ip_address_selection;                                          // Permet de choisir la selection par defaut à l'ouverture de la fenetre

void CPingIcmpDlg::On_button_about()
            {
            // ********************************************************
            // Concatenation de l'affichage
            // ********************************************************
            sprintf(tampon_char,"                                    PingIcmp Version 2.5");
            sprintf(tampon_char,"%s\n",tampon_char);
            sprintf(tampon_char,"%s\nCreate on March 29, 2003",tampon_char);
            sprintf(tampon_char,"%s\nLast compilation on February 08, 2004",tampon_char);
            sprintf(tampon_char,"%s\nSebF@FrameIP.com",tampon_char);
            sprintf(tampon_char,"%s\nwww.frameip.com",tampon_char);
            sprintf(tampon_char,"%s\n\n",tampon_char);
            sprintf(tampon_char,"%s\n3 advantages of PingIcmp",tampon_char);
            sprintf(tampon_char,"%s\n",tampon_char);
            sprintf(tampon_char,"%s\n        - Measure response time lower than the millisecond",tampon_char);
            sprintf(tampon_char,"%s\n        - Hacking if you change your IP source",tampon_char);
            sprintf(tampon_char,"%s\n        - Flood the bandwidth to 65 Mbps with a 100Mbps card",tampon_char);

            // ********************************************************
            // Affichage de l'About en mode fenêtre
            // ********************************************************
            MessageBox(tampon_char,"About",0);           
            }

// ********************************************************
// Déclaration de la DialogBox CPingIcmpDlg - DEBUT -
// ********************************************************
CPingIcmpDlg::CPingIcmpDlg(CWnd* pParent ) : CDialog(CPingIcmpDlg::IDD, pParent)
, m_edit_taille_range(0)
, m_edit_ttl_range(0)
, m_edit_pause_range(0)
, m_edit_timeout_range(0)
, m_edit_nombre_de_fois_range(0)
{
            //{{AFX_DATA_INIT(CPingIcmpDlg)
            //}}AFX_DATA_INIT
            m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
            }

void CPingIcmpDlg::DoDataExchange(CDataExchange* pDX)
            {
                        CDialog::DoDataExchange(pDX);
                        //{{AFX_DATA_MAP(CPingIcmpDlg)
                        DDX_Control(pDX, IDC_spin_taille, m_spin_taille_control);
                        DDX_Control(pDX, IDC_spin_pause, m_spin_pause_control);
                        DDX_Control(pDX, IDC_spin_timeout, m_spin_timeout_control);
                        DDX_Control(pDX, IDC_spin_nombre_de_fois, m_spin_nombre_de_fois_control);
                        DDX_Control(pDX, IDC_spin_ttl, m_spin_ttl_control);
                        DDX_Control(pDX, IDC_button_ping, m_button_ping_control);
                        DDX_Control(pDX, IDC_edit_nombre_de_fois, m_edit_nombre_de_fois_control);
                        DDX_Control(pDX, IDC_check_boucle, m_check_boucle_control);
                        DDX_Control(pDX, IDC_check_reception, m_check_reception_control);
                        DDX_Control(pDX, IDC_edit_reception, m_edit_reception_control);
                        //}}AFX_DATA_MAP
                        DDX_Control(pDX, IDC_edit_timeout, m_edit_timeout_control);
                        DDX_Control(pDX, IDC_edit_ip_source, m_edit_ip_source_control);
                        DDX_Control(pDX, IDC_edit_ip_destination, m_edit_ip_destination_control);
                        DDX_Control(pDX, IDC_edit_pause, m_edit_pause_control);
                        DDX_Control(pDX, IDC_edit_taille, m_edit_taille_control);
                        DDX_Control(pDX, IDC_edit_ttl, m_edit_ttl_control);
                        DDX_Text(pDX, IDC_edit_taille, m_edit_taille_range);
                        DDV_MinMaxInt(pDX, m_edit_taille_range, 0, 65535);
                        DDX_Text(pDX, IDC_edit_ttl, m_edit_ttl_range);
                        DDV_MinMaxInt(pDX, m_edit_ttl_range, 0, 255);
                        DDX_Text(pDX, IDC_edit_pause, m_edit_pause_range);
                        DDV_MinMaxInt(pDX, m_edit_pause_range, 1, 65535);
                        DDX_Text(pDX, IDC_edit_timeout, m_edit_timeout_range);
                        DDV_MinMaxInt(pDX, m_edit_timeout_range, 1, 65535);
                        DDX_Text(pDX, IDC_edit_nombre_de_fois, m_edit_nombre_de_fois_range);
                        DDV_MinMaxInt(pDX, m_edit_nombre_de_fois_range, 1, 65535);
}

BEGIN_MESSAGE_MAP(CPingIcmpDlg, CDialog)
            // **************************************************
            // Liste des fonctions tournant en boucle en tâche de fond
            // **************************************************
            ON_WM_SYSCOMMAND() // Attente d'une interaction avec la fenêtre principale du type menu, croix pour fermer. Si il detect une action, alors il appel la fonction void CPingIcmpDlg::OnSysCommand(UINT nID, LPARAM lParam)
            ON_WM_PAINT()
            ON_WM_QUERYDRAGICON()
            ON_BN_CLICKED(IDC_check_boucle, On_check_boucle)
            ON_BN_CLICKED(IDC_button_ping, On_button_ping)
            ON_BN_CLICKED(IDC_button_clear, On_button_clear)
            ON_BN_CLICKED(IDC_button_stop, On_button_stop)
            ON_WM_CLOSE()
            ON_BN_CLICKED(IDC_button_about, On_button_about)
            ON_EN_CHANGE(IDC_edit_ttl, On_Change_edit_ttl)
            ON_EN_CHANGE(IDC_edit_nombre_de_fois, On_Change_edit_nombre_de_fois)
            ON_EN_CHANGE(IDC_edit_taille, On_Change_edit_taille)
            ON_BN_CLICKED(IDC_button_source, OnBn_Clicked_button_get_source)
            ON_BN_CLICKED(IDC_button_destination, OnBn_Clicked_button_get_destination)
            ON_BN_CLICKED(IDC_check_reception, OnBn_Clicked_check_reception)
            ON_EN_CHANGE(IDC_edit_pause, On_En_Change_edit_pause)
            ON_EN_CHANGE(IDC_edit_timeout, OnEn_Change_edit_timeout)
END_MESSAGE_MAP()
// ********************************************************
// Déclaration de la DialogBox CPingIcmpDlg - FIN -
// ********************************************************

BOOL CPingIcmpDlg::OnInitDialog()
            {
            struct structure_ip_local reception_des_ip_locales;

            // **************************************************
            // Orginie VC++
            // **************************************************
            CDialog::OnInitDialog();
            SetIcon(m_hIcon, TRUE);                              // Set big icon
            SetIcon(m_hIcon, FALSE);                 // Set small icon

            // **************************************************
            // Insert le "String Table" dans le menu
            // **************************************************
            ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
            ASSERT(IDM_ABOUTBOX < 0xF000);

            CMenu* pSysMenu = GetSystemMenu(FALSE);
            if (pSysMenu != NULL)
                        {
                        CString strAboutMenu;
                        strAboutMenu.LoadString(IDS_ABOUTBOX);
                        if (!strAboutMenu.IsEmpty())
                                   {
                                   pSysMenu->AppendMenu(MF_SEPARATOR);
                                   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
                                   }
                        }

            // ********************************************************
            // Initiation diverse
            // ********************************************************
            QueryPerformanceFrequency((LARGE_INTEGER *)&cpu_frequence);
            m_edit_pause=1000;
            m_edit_timeout=1000;
            m_edit_nombre_de_fois=1;
           
            // ********************************************************
            // Initialisation des data
            // ********************************************************
            strcpy(data_reference,"www.frameip.com www.frameip.com ");
            strcpy(data_a_envoyer,data_reference);
            m_edit_taille=32;

            // ********************************************************
            // Initialisation de l'entete Icmp
            // ********************************************************
            entete_icmp_emission.type=8;
            entete_icmp_emission.code=0;
            entete_icmp_emission.checksum=0;
            entete_icmp_emission.id=(unsigned short)GetCurrentProcessId();
            entete_icmp_emission.sequence=1;

            // ********************************************************
            // Initialisation de l'entete Ip
            // ********************************************************
            entete_ipv4_emission.ihl=5;
            entete_ipv4_emission.version=4;
            entete_ipv4_emission.tos=0;
            entete_ipv4_emission.length=htons((unsigned short)(20+strlen(data_a_envoyer)));
            entete_ipv4_emission.id=(unsigned short)htonl(67);
            entete_ipv4_emission.offset=0;
            entete_ipv4_emission.ttl=100;
            entete_ipv4_emission.type=1;
            entete_ipv4_emission.checksum=0;
            reception_des_ip_locales=recuperation_ip_local(TRUE);
            entete_ipv4_emission.ip_source=resolution_de_nom(TRUE,reception_des_ip_locales.adresse_ip_local[0]);
            entete_ipv4_emission.ip_destination=resolution_de_nom(TRUE,"www.yahoo.fr");

            // **************************************************
            // Initialisation de la reception
            // **************************************************
            m_check_reception_control.SetCheck(1);
            m_edit_reception_control.SetReadOnly(1);
            CPingIcmpDlg::OnBn_Clicked_check_reception();
           
            // **************************************************
            // Initialisation des Range
            // **************************************************
            m_spin_ttl_control.SetRange32(0,255);
            m_spin_nombre_de_fois_control.SetRange32(1,65535);
            m_spin_taille_control.SetRange32(0,65535);
            m_spin_pause_control.SetRange32(1,65535);
            m_spin_timeout_control.SetRange32(1,65535);

            // **************************************************
            // Mise à jour des champs
            // **************************************************
            sprintf(tampon_char,"%d",m_edit_timeout);
            m_edit_timeout_control.SetWindowText(tampon_char);
            sprintf(tampon_char,"%d",m_edit_nombre_de_fois);
            m_edit_nombre_de_fois_control.SetWindowText(tampon_char);
            sprintf(tampon_char,"%d",entete_ipv4_emission.ttl);
            m_edit_ttl_control.SetWindowText(tampon_char);
            m_edit_ip_source_control.SetWindowText(reception_des_ip_locales.adresse_ip_local[0]);
            m_edit_ip_destination_control.SetWindowText("www.yahoo.fr");
            sprintf(tampon_char,"%d",m_edit_pause);
            m_edit_pause_control.SetWindowText(tampon_char);
            sprintf(tampon_char,"%d",m_edit_taille);
            m_edit_taille_control.SetWindowText(tampon_char);

            // ********************************************************
            // Je concidère à ce niveau que la fenêtre est affichée
            // ********************************************************
            initialisation=TRUE;

            return TRUE;  // return TRUE  unless you set the focus to a control
            }

void CPingIcmpDlg::OnSysCommand(UINT nID, LPARAM lParam)
            {
            // **************************************************
            // Si l'utilisateur selectionne le menu About
            // **************************************************
            if ((nID & 0xFFF0) == IDM_ABOUTBOX)
                        On_button_about();
            else
                        CDialog::OnSysCommand(nID, lParam);
            }

void CPingIcmpDlg::OnPaint()
{
            if (IsIconic())
            {
                        CPaintDC dc(this); // device context for painting

                        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

                        // Center icon in client rectangle
                        int cxIcon = GetSystemMetrics(SM_CXICON);
                        int cyIcon = GetSystemMetrics(SM_CYICON);
                        CRect rect;
                        GetClientRect(&rect);
                        int x = (rect.Width() - cxIcon + 1) / 2;
                        int y = (rect.Height() - cyIcon + 1) / 2;

                        // Draw the icon
                        dc.DrawIcon(x, y, m_hIcon);
            }
            else
            {
                        CDialog::OnPaint();
            }
}

HCURSOR CPingIcmpDlg::OnQueryDragIcon()
{
            return (HCURSOR) m_hIcon;
}

void CPingIcmpDlg::recpetion(void)
            {
            int compteur=0;
            SOCKADDR_IN translation;
            char buffer_de_reception[65535];
            char ip_source_reception[15];
            char ip_destination_reception[15];
            char resultat[100000];
            int duree_de_la_boucle;
            BOOL sortie_de_la_boucle;
            CString conversion;

            // ********************************************************
            // Initialisation
            // ********************************************************
            duree_de_la_boucle=GetTickCount();
            sortie_de_la_boucle=FALSE;

            // ********************************************************
            // Boucle d'attente de la trame retour
            // ********************************************************
            liberation_du_jeton();
            while ((m_edit_pause!=0)&&(sortie_de_la_boucle==FALSE))
                        {
                        liberation_du_jeton();
                        nombre_de_caractere_recu=recv(id_de_la_socket,buffer_de_reception,65535,0);

                        // ********************************************************
                        // Vérifie si la durée de la boucle est suppérieur au temps d'attente demandé par l'utilisateur
                        // ********************************************************
                        liberation_du_jeton();
                        if (GetTickCount()-duree_de_la_boucle>(unsigned)(m_edit_pause))
                                   sortie_de_la_boucle=TRUE;

                        // ********************************************************
                        // Si une trame est receptionnée
                        // ********************************************************
                        if (nombre_de_caractere_recu!=-1)
                                   {
                                   // ********************************************************
                                   // Transformation en IP de type xxx.xxx.xxx.xxx
                                   // ********************************************************
                                   liberation_du_jeton();
                                   entete_ipv4_reception=(struct ipv4 *)buffer_de_reception;
                                   translation.sin_addr.s_addr=entete_ipv4_reception->ip_source;
                                   strcpy(ip_source_reception,inet_ntoa(translation.sin_addr));
                                   translation.sin_addr.s_addr=entete_ipv4_reception->ip_destination;
                                   strcpy(ip_destination_reception,inet_ntoa(translation.sin_addr));

                                   // ********************************************************
                                   // Vérification de la conformité dela trame réçu
                                   // ********************************************************
                                   liberation_du_jeton();
                                   entete_icmp_reception=(struct icmp *)(buffer_de_reception+20);
                                   if (entete_ipv4_reception->ip_source==entete_ipv4_emission.ip_destination)
                                               compteur++;
                                   if (entete_ipv4_reception->ip_destination==entete_ipv4_emission.ip_source)
                                               compteur++;
                                   if (entete_icmp_reception->type==0)
                                               compteur++;
                                   if (entete_icmp_reception->code==0)
                                               compteur++;
                                   if (entete_icmp_emission.id==entete_icmp_reception->id)
                                               compteur++;
                                   if (entete_icmp_emission.sequence==entete_icmp_reception->sequence)
                                               compteur++;
                                   if (compteur!=6) // Trame recu non conforme
                                               nombre_de_caractere_recu=-1;
                                   else  // Trame recu conforme
                                               {
                                               // ********************************************************
                                               // Calcul du temps de réponse
                                               // ********************************************************
                                               liberation_du_jeton();
                                               QueryPerformanceCounter((LARGE_INTEGER *)&temps_de_reponse2);
                                               temps_de_reponse=((double)((temps_de_reponse2.QuadPart-temps_de_reponse1.QuadPart) *(double)1000.0/(double)cpu_frequence.QuadPart));
                                               sortie_de_la_boucle=TRUE;
                                               }
                                   }
                        }
           
            // **************************************************
            // Affichage de la reception
            // **************************************************
            liberation_du_jeton();
            m_edit_reception_control.GetWindowText(conversion);         // Récupère le contennu de la fenetre reception
            sprintf(resultat,"%s",conversion);
            if(conversion!="") // Permet de ne pas rajouter de retour charriot si la fenetre de reception est vide
                        sprintf(resultat,"%s\r\n",resultat);
            liberation_du_jeton();
            if (nombre_de_caractere_emis==-1)
                        sprintf(resultat,"%sCan not send Ping. Number error : %d",resultat,numero_d_erreur);
            else
                        if (nombre_de_caractere_recu==-1)
                                   sprintf(resultat,"%sNot answer, Timeout",resultat);
                        else
                                   {
                                   liberation_du_jeton();
                                   sprintf(resultat,"%s%.3d",resultat,entete_icmp_reception->sequence);
                                   sprintf(resultat,"%s        %s",resultat,ip_source_reception);
                                   sprintf(resultat,"%s      %s",resultat,ip_destination_reception);
                                   sprintf(resultat,"%s      TTL %d",resultat,entete_ipv4_reception->ttl);
                                   sprintf(resultat,"%s      %d Octets",resultat,nombre_de_caractere_recu-28);
                                   sprintf(resultat,"%s      %.2f ms",resultat,temps_de_reponse);
                                   }
            liberation_du_jeton();
            m_edit_reception_control.SetWindowText(resultat);    // Affichage dans la fenetre reception
            m_edit_reception_control.LineScroll(100000);                        // Permet de faire decendre l'affichage de la fenetre si nécessaire
            }

void CPingIcmpDlg::On_button_ping()
            {
            WSADATA initialisation_win32;
            char trame_a_envoyer[65535]; // Chaine contennant toutes les entêtes et les data
            SOCKADDR_IN information_sur_la_destination;

            // **************************************************
            // Initiation dirvers
            // **************************************************
            m_button_ping_control.EnableWindow(FALSE); // Desactive le bouton Ping
            nfois=m_edit_nombre_de_fois;

            // ********************************************************
            // Initialisation de la Socket
            // **************************************************
            WSAStartup(MAKEWORD(2,2),&initialisation_win32);
            id_de_la_socket=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);

            // ********************************************************
            // Activation de l'envoi de l'entete IP
            // **************************************************
            tampon_int=1;
            setsockopt(id_de_la_socket,IPPROTO_IP,IP_HDRINCL,(char *)&tampon_int,sizeof(tampon_int));

            // **************************************************
            // Boucle d'envoi des Ping
            // **************************************************
            while (nfois>0)
                        {
                        liberation_du_jeton();   // Rend la main à la fenêtre principale

                        // ********************************************************
                        // La commande recv attend n ms (m_edit_timeout) avant de rendre la main
                        // **************************************************
                        tampon_int=m_edit_timeout;
                        setsockopt(id_de_la_socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&tampon_int,sizeof(tampon_int));

                        // ********************************************************
                        // Calcul du checksum ICMP
                        // ********************************************************
                        entete_icmp_emission.checksum=calcul_du_checksum_icmp(TRUE,entete_icmp_emission,data_a_envoyer);
                       
                        // ********************************************************
                        // Concatenation des entetes avec la data
                        // ********************************************************
                        memcpy(trame_a_envoyer,(unsigned short *)&entete_ipv4_emission,sizeof(struct ipv4));
                        memcpy(trame_a_envoyer+sizeof(struct ipv4),(unsigned short *)&entete_icmp_emission,sizeof(struct icmp));
                        memcpy(trame_a_envoyer+sizeof(struct ipv4)+sizeof(struct icmp),data_a_envoyer,strlen(data_a_envoyer));
                        liberation_du_jeton();

                        // ********************************************************
                        // Paramètre nécessaire au sendto
                        // ********************************************************
                        information_sur_la_destination.sin_family=AF_INET;
                        information_sur_la_destination.sin_addr.s_addr=entete_ipv4_emission.ip_destination;

                        // **************************************************
                        // Envoi du Ping
                        // **************************************************
                        QueryPerformanceCounter((LARGE_INTEGER *)&temps_de_reponse1);
                        liberation_du_jeton();
                        nombre_de_caractere_emis=sendto(id_de_la_socket,trame_a_envoyer,sizeof(struct ipv4)+sizeof(struct icmp)+strlen(data_a_envoyer),0,(struct sockaddr*)&information_sur_la_destination,sizeof(information_sur_la_destination));
                        numero_d_erreur=WSAGetLastError();
                        liberation_du_jeton();

                        // **************************************************
                        // Reception du Ping
                        // **************************************************
                        if (m_check_reception_control.GetCheck()==TRUE)
                                   CPingIcmpDlg::recpetion();

                        // **************************************************
                        // Incrémentation du numéro de séquence
                        // **************************************************
                        if (entete_icmp_emission.sequence==65535)
                                   entete_icmp_emission.sequence=0;
                        else
                                   entete_icmp_emission.sequence++;
           
                        // **************************************************
                        // Décrémente la boucle
                        // **************************************************
                        liberation_du_jeton();
                        if (m_check_boucle_control.GetCheck()==FALSE) // Uniquement si la boucle infinie n'est pas séléctionnée par l'utilisateur
                                   nfois--;

                        // **************************************************
                        // Pause entre chaque Ping
                        // **************************************************
                        liberation_du_jeton();
                        if (nfois>0)
                                   pause(TRUE,m_edit_pause);
                        }

            // ********************************************************
            // Activtion du bouton Ping
            // ********************************************************
            m_button_ping_control.EnableWindow(TRUE);

            // ********************************************************
            // Fermuture Générale
            // ********************************************************
            fermeture_de_la_socket();
            }

void CPingIcmpDlg::On_button_clear()
            {
            // **************************************************
            // Clear la fenêtre d'affichage
            // **************************************************
            m_edit_reception_control.SetWindowText("");
            }

void CPingIcmpDlg::On_button_stop()
            {
            // **************************************************
            // Procédure permettant l'arrêt de la boucle
            // **************************************************
            nfois=0;
            }

void CPingIcmpDlg::OnClose()
            {
            // **************************************************
            // Procédure executé à la fermeture de la fenêtre
            // **************************************************
            nfois=0; // Ferme la boucle pour pas que le process reste dans le gestionnaire des tâches
            CDialog::OnClose();
            }

void CPingIcmpDlg::fermeture_de_la_socket(void)
            {
            // ********************************************************
            // Fermeture de la session TCP Correspondant à la commande connect()
            // ********************************************************
            shutdown(id_de_la_socket,2); // 2 signifie socket d'emeission et d'ecoute

            // ********************************************************
            // Fermeture de la socket correspondant à la commande socket()
            // ********************************************************
            closesocket(id_de_la_socket);

            // ********************************************************
            // quite propement le winsock ouvert avec la commande WSAStartup
            // ********************************************************
            WSACleanup(); //  (A appeller autant de fois qu'il a été ouvert)
            }

void CPingIcmpDlg::OnBn_Clicked_button_get_source()
            {
            class_ip_address fenetre_ip_adresse;
            SOCKADDR_IN translation;  // Structure nécessaire à la transformation du nombre inet_addr en IP char*

            class_ip_address_selection=1; // Annonce à la prochaine boite de dialogue la selection

            // ********************************************************
            // Lancement de la boite de dialogue pour la saisie de l'IP
            // ********************************************************
            if (fenetre_ip_adresse.DoModal()==TRUE)
                        {
                        entete_ipv4_emission.ip_source=class_ip_address_retour_de_fenetre;
                        translation.sin_addr.s_addr=class_ip_address_retour_de_fenetre; // Convertion du Inet_addr en format char *
                        m_edit_ip_source_control.SetWindowText(inet_ntoa(translation.sin_addr));
                        }         
            }

void CPingIcmpDlg::OnBn_Clicked_button_get_destination()
            {
            class_ip_address fenetre_ip_adresse;
            SOCKADDR_IN translation;  // Structure nécessaire à la transformation du nombre inet_addr en IP char*

            class_ip_address_selection=3;             // Annonce à la prochaine boite de dialogue la selection

            // ********************************************************
            // Lancement de la boite de dialogue pour la saisie de l'IP
            // ********************************************************
            if (fenetre_ip_adresse.DoModal()==TRUE)
                        {
                        entete_ipv4_emission.ip_destination=class_ip_address_retour_de_fenetre;
                        translation.sin_addr.s_addr=class_ip_address_retour_de_fenetre; // Convertion du Inet_addr en format char *
                        m_edit_ip_destination_control.SetWindowText(inet_ntoa(translation.sin_addr));
                        }         
            }

void CPingIcmpDlg::On_check_boucle()
            {
            // **************************************************
            // Désactive le champ "Nombre de fois" quand la case à coché boucle est activé
            // **************************************************
            m_edit_nombre_de_fois_control.SetReadOnly(m_check_boucle_control.GetCheck()); // Désactive le champ Edit
            m_spin_nombre_de_fois_control.EnableScrollBarCtrl(1,m_check_boucle_control.GetCheck()); // Desactive le Spin
            }

void CPingIcmpDlg::OnBn_Clicked_check_reception()
            {
            // ********************************************************
            // Désactivation du champ Edit
            // ********************************************************
            m_edit_timeout_control.SetReadOnly(!m_check_reception_control.GetCheck());
            }

void CPingIcmpDlg::On_En_Change_edit_pause()
            {
            if (initialisation==TRUE) // Vérifie si la fenêtre est présente sinon UpdateData fait planter lprogramme
                        {
                        UpdateData(TRUE);
                        m_edit_pause_control.GetWindowText(tampon_char,sizeof(tampon_char));
                        m_edit_pause=(unsigned short)atoi(tampon_char);
                        }
            }

void CPingIcmpDlg::OnEn_Change_edit_timeout()
            {
            if (initialisation==TRUE) // Vérifie si la fenêtre est présente sinon UpdateData fait planter lprogramme
                        {
                        UpdateData(TRUE);
                        m_edit_timeout_control.GetWindowText(tampon_char,sizeof(tampon_char));
                        m_edit_timeout=(unsigned short)atoi(tampon_char);
                        }
            }

void CPingIcmpDlg::On_Change_edit_nombre_de_fois()
            {
            if (initialisation==TRUE) // Vérifie si la fenêtre est présente sinon UpdateData fait planter lprogramme
                        {
                        UpdateData(TRUE);
                        m_edit_nombre_de_fois_control.GetWindowText(tampon_char,sizeof(tampon_char));
                        m_edit_nombre_de_fois=(unsigned short)atoi(tampon_char);
                        }
            }

void CPingIcmpDlg::On_Change_edit_taille()
            {
            if (initialisation==TRUE) // Vérifie si la fenêtre est présente sinon UpdateData fait planter lprogramme
                        {
                        UpdateData(TRUE);
                        m_edit_taille_control.GetWindowText(tampon_char,sizeof(tampon_char));
                        m_edit_taille=(unsigned short)atoi(tampon_char);
           
                        // ********************************************************
                        // Dimentionnement des data
                        // ********************************************************
                        strcpy(data_a_envoyer,dimensionnement_de_data_a_envoyer(TRUE,data_reference,m_edit_taille));
                        }
            }
           
void CPingIcmpDlg::On_Change_edit_ttl()
            {
            if (initialisation==TRUE) // Vérifie si la fenêtre est présente sinon UpdateData fait planter lprogramme
                        {
                        UpdateData(TRUE);
                        m_edit_ttl_control.GetWindowText(tampon_char,65535);
                        entete_ipv4_emission.ttl=(unsigned char)atoi(tampon_char);
                        }
            }

7.5 - class_ip_address.h

#pragma once

// ********************************************************
// Définition de la class class_ip_address
// ********************************************************
class class_ip_address : public CDialog
            {  
            // constructeur standard
            public : class_ip_address(CWnd* pParent = NULL);

            // Données de boîte de dialogue
            enum { IDD = IDD_ip_address };
   
            // Prise en charge DDX/DDV
            protected : virtual void DoDataExchange(CDataExchange* pDX);

            DECLARE_MESSAGE_MAP()
            public:
                        afx_msg void OnBn_Clicked_button_ok();
                        afx_msg void OnBn_Clicked_button_cancel();
                        void class_ip_address::mise_a_jour_des_readonly();
                        afx_msg void OnBn_Clicked_check_local_ip_address();
                        afx_msg void OnBn_Clicked_check_ip_address();
                        afx_msg void OnBn_Clicked_check_host_name();
                        virtual BOOL OnInitDialog();
                        CButton m_check_local_ip_address_control;
                        CButton m_check_ip_address_control;
                        CButton m_check_host_name_control;
                        CComboBox m_combobox_local_ip_address_control;
                        CIPAddressCtrl m_ip_address_ip_address_control;
                        CEdit m_edit_host_name_control;
                        afx_msg void OnCbn_Sel_change_combobox_local_ip_address();
                        afx_msg void On_Ipn_Field_changed_edit_ip_address(NMHDR *pNMHDR, LRESULT *pResult);
                        afx_msg void On_En_Change_edit_hostname();
                        afx_msg void OnNMThemeChangedcomboboxlocalipaddress(NMHDR *pNMHDR, LRESULT *pResult);
                        afx_msg void OnCbnCloseupcomboboxlocalipaddress();
                        afx_msg void OnCbnSelendokcomboboxlocalipaddress();
                        afx_msg void OnCbnEditupdatecomboboxlocalipaddress();
            };

7.6 - class_ip_address.cpp

#include "stdafx.h"
#include "PingIcmp.h"
#include "PingIcmp.h"
#include "class_ip_address.h"
#include "windows.h"
#include <C:\\RepPerso\\Personnel\\Developpement\\Projets\\LibrairieSocket\\LibrairieSocket.h>

// **************************************************
// Les variables
// **************************************************
char m_combobox_local_ip_address[15];
DWORD m_ip_address_ip_address;
char m_edit_host_name[1000];

// **************************************************
// Les variables externes permetant le dialogue entre les différents cpp
// **************************************************
DWORD class_ip_address_retour_de_fenetre;           // Voir déclaration original
BOOL class_ip_address_selection;                             // Voir déclaration original

// ********************************************************
// Déclaration de la DialogBox ip_adresse - DEBUT -
// ********************************************************
class_ip_address::class_ip_address(CWnd* pParent /*=NULL*/)      : CDialog(class_ip_address::IDD, pParent)
            {
            }

void class_ip_address::DoDataExchange(CDataExchange* pDX)
            {
            CDialog::DoDataExchange(pDX);
            DDX_Control(pDX, IDC_check_local_ip_address, m_check_local_ip_address_control);
            DDX_Control(pDX, IDC_check_ip_address, m_check_ip_address_control);
            DDX_Control(pDX, IDC_check_host_name, m_check_host_name_control);
            DDX_Control(pDX, IDC_combobox_local_ip_address, m_combobox_local_ip_address_control);
            DDX_Control(pDX, IDC_edit_ip_address, m_ip_address_ip_address_control);
            DDX_Control(pDX, IDC_edit_host_name, m_edit_host_name_control);
            }

BEGIN_MESSAGE_MAP(class_ip_address, CDialog)
            ON_BN_CLICKED(IDC_button_ok, OnBn_Clicked_button_ok)
            ON_BN_CLICKED(IDC_button_cancel, OnBn_Clicked_button_cancel)
            ON_BN_CLICKED(IDC_check_local_ip_address, OnBn_Clicked_check_local_ip_address)
            ON_BN_CLICKED(IDC_check_ip_address, OnBn_Clicked_check_ip_address)
            ON_BN_CLICKED(IDC_check_host_name, OnBn_Clicked_check_host_name)
END_MESSAGE_MAP()
// ********************************************************
// Déclaration de la DialogBox ip_adresse - FIN -
// ********************************************************

BOOL class_ip_address::OnInitDialog()
            {
            struct structure_ip_local reception_des_ip_locales;
            int i;
           
            // **************************************************
            // Orginie VC++
            // **************************************************
            CDialog::OnInitDialog();

            // **************************************************
            // Initialisation de bouton check par defaut
            // **************************************************
            if (class_ip_address_selection==1)
                        m_check_local_ip_address_control.SetCheck(TRUE);
            else
                        if (class_ip_address_selection==2)
                                   m_check_ip_address_control.SetCheck(TRUE);
                        else
                                   m_check_host_name_control.SetCheck(TRUE);

            // **************************************************
            // Initialisation du ComboBox Ip Source
            // **************************************************
            reception_des_ip_locales=recuperation_ip_local(TRUE);
            for (i=0;i<reception_des_ip_locales.nombre_d_ip_local;i++)
                        m_combobox_local_ip_address_control.AddString(reception_des_ip_locales.adresse_ip_local[i]);
            strcpy(m_combobox_local_ip_address,reception_des_ip_locales.adresse_ip_local[0]);
            m_combobox_local_ip_address_control.SetCurSel(0);

            // **************************************************
            // Initialisation des ReadOnly
            // **************************************************
            class_ip_address::mise_a_jour_des_readonly();

            return TRUE;
            }

void class_ip_address::OnBn_Clicked_button_ok()
            {
            // ********************************************************
            // Si c'est le champ Combobox des ip locale qui est sélectionné
            // ********************************************************
            if(m_check_local_ip_address_control.GetCheck()==TRUE)
                        {
                        m_combobox_local_ip_address_control.GetWindowText(m_combobox_local_ip_address ,sizeof(m_combobox_local_ip_address));
                        class_ip_address_retour_de_fenetre=resolution_de_nom(TRUE,m_combobox_local_ip_address);
                        }
           
            // ********************************************************
            // Si c'est le champ IpAddresCtrl de saisie de l'IP qui est sélectionné
            // ********************************************************
                        if(m_check_ip_address_control.GetCheck()==TRUE)
                                   {
                                   m_ip_address_ip_address_control.GetAddress(m_ip_address_ip_address);
                                   class_ip_address_retour_de_fenetre=ntohl(m_ip_address_ip_address);
                                   if (class_ip_address_retour_de_fenetre==0)
                                               MessageBox("Sorry - You must specify an Ip address","Specify an Ip address",0);
                                   }
           
            // ********************************************************
            // Si c'est le champ Edit du nom d'hote qui est sélectionné
            // ********************************************************
            if(m_check_host_name_control.GetCheck()==TRUE)
                        {
                        m_edit_host_name_control.GetWindowText(m_edit_host_name,sizeof(m_edit_host_name));
                        class_ip_address_retour_de_fenetre=resolution_de_nom(TRUE,m_edit_host_name);
                        if (class_ip_address_retour_de_fenetre==0)
                                   MessageBox("Sorry, I can't resolve the host name","Can't resolve host name",0);
                        }
            if (class_ip_address_retour_de_fenetre!=0)
                        OnOK(); // Ferme la fenetre en renvoyant TRUE
            }

void class_ip_address::OnBn_Clicked_button_cancel()
            {
            OnCancel(); // Ferme la fenetre en renvoyant FALSE
            }

void class_ip_address::mise_a_jour_des_readonly()
            {
            // ********************************************************
            // Met à jour les options ReadOnly des différents champs
            // ********************************************************
            m_combobox_local_ip_address_control.EnableWindow(m_check_local_ip_address_control.GetCheck());
            m_ip_address_ip_address_control.EnableWindow(m_check_ip_address_control.GetCheck());
            m_edit_host_name_control.SetReadOnly(!m_check_host_name_control.GetCheck());
            }

void class_ip_address::OnBn_Clicked_check_local_ip_address()
            {
            // ********************************************************
            // Au moin un check doit être active
            // ********************************************************
            if (m_check_host_name_control.GetCheck() +m_check_local_ip_address_control.GetCheck() +m_check_ip_address_control.GetCheck()==0)
                        m_check_local_ip_address_control.SetCheck(TRUE);

            // ********************************************************
            // Un seul check ne doit être active
            // ********************************************************
            if (m_check_local_ip_address_control.GetCheck()==TRUE)
                        {
                        // Désactive donc les autres entêtes
                        m_check_ip_address_control.SetCheck(FALSE);
                        m_check_host_name_control.SetCheck(FALSE);
                        }
            mise_a_jour_des_readonly();
            }

void class_ip_address::OnBn_Clicked_check_ip_address()
            {
            // ********************************************************
            // Au moin un check doit être active
            // ********************************************************
            if (m_check_host_name_control.GetCheck() +m_check_local_ip_address_control.GetCheck() +m_check_ip_address_control.GetCheck()==0)
                        m_check_ip_address_control.SetCheck(TRUE);

            // ********************************************************
            // Un seul check ne doit être active
            // ********************************************************
            if (m_check_ip_address_control.GetCheck()==TRUE)
                        {
                        // Désactive donc les autres entêtes
                        m_check_local_ip_address_control.SetCheck(FALSE);
                        m_check_host_name_control.SetCheck(FALSE);
                        }
            mise_a_jour_des_readonly();
            }

void class_ip_address::OnBn_Clicked_check_host_name()
            {
            // ********************************************************
            // Au moin un check doit être active
            // ********************************************************
            if (m_check_host_name_control.GetCheck() +m_check_local_ip_address_control.GetCheck() +m_check_ip_address_control.GetCheck()==0)
                        m_check_host_name_control.SetCheck(TRUE);

            // ********************************************************
            // Un seul check ne doit être active
            // ********************************************************
            if (m_check_host_name_control.GetCheck()==TRUE)
                        {
                        // ********************************************************
                        // Désactive donc les autres entêtes
                        // ********************************************************
                        m_check_local_ip_address_control.SetCheck(FALSE);
                        m_check_ip_address_control.SetCheck(FALSE);
                        }
            mise_a_jour_des_readonly();
            }

7.7 - resource.h

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by PingIcmp.rc
//
#define IDM_ABOUTBOX                    0x0010
#define IDS_ABOUTBOX                    101
#define IDR_MAINFRAME                   128
#define IDD_PINGICMP_DIALOG             136
#define IDD_ABOUTBOX                    149
#define IDD_ip_address                  150
#define IDC_edit_ip_destination         1009
#define IDC_edit_ttl                    1010
#define IDC_edit_ip_source              1011
#define IDC_check_boucle                1012
#define IDC_edit_nombre_de_fois         1013
#define IDC_IDC_scrollbar_nombre_de_fois 1014
#define IDC_edit_pause                  1015
#define IDC_edit_timeout                1016
#define IDC_edit_taille                 1017
#define IDC_check_reception             1018
#define IDC_button_ping                 1025
#define IDC_button_stop                 1026
#define IDC_edit_reception              1028
#define IDC_spin_ttl                    1032
#define IDC_spin_nombre_de_fois         1033
#define IDC_button_clear                1035
#define IDC_spin_timeout                1036
#define IDC_spin_pause                  1037
#define IDC_spin_taille                 1038
#define IDC_button_about                1039
#define IDC_test                        1051
#define IDC_edit_host_name              1052
#define IDC_button_ok                   1054
#define IDC_button_cancel               1055
#define IDC_static_titre                1056
#define IDC_check_ip_address            1057
#define IDC_check_host_name             1058
#define IDC_check_local_ip_address      1059
#define IDC_edit_ip_address             1060
#define IDC_combobox_local_ip_address   1061
#define IDC_button_destination          1062
#define IDC_button_source               1063

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        151
#define _APS_NEXT_COMMAND_VALUE         32772
#define _APS_NEXT_CONTROL_VALUE         1067
#define _APS_NEXT_SYMED_VALUE           105
#endif
#endif



mot clé : trame icmp ipv4 protocole icmp 2003 voip negociation icmp flood free adresse icmp generateur datatgrame icmp win32 decouverte icmp echo requete icmp freeware console resolution icmp software ip source frame icmp windows comprendre icmp exe outil executable vpn tcpip ipv6 ping flooding programme download temps de reponse liaison icmp ip miliseconde utilitaire debit tool pingicmp protocol icmp new tout sur icmp datagramme icmp 21 spoffing shareware ms mesure graphique tous sur icmp janvier connaitre icmp reponse icmp

Copyright © 2011-2015 FrameIP TcpIP. Tous droits réservés. Les marques et marques commerciales mentionnées appartiennent à leurs propriétaires respectifs. L'utilisation de ce site Web TcpIP implique l'acceptation des conditions d'utilisation et du règlement sur le respect de la vie privée.
Sécurité entreprise Téléphonie entreprise Expert de votre Infrastructure Test ADSL Serinya Operateur Telecom