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

MFC Discussion :

Scanner réseau local avec MFC + sockets


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 87
    Par défaut Scanner réseau local avec MFC + sockets
    Bonjour,

    J'ai fais une application MFC client/serveur avec les sockets, et je voudrais savoir quel code utilisé pour scanner un réseau local, c'est-à-dire :

    - Scanner les 255 adresses d'un réseau local en 192.168.0.0,
    - Repérer les adresses utilisé.

    Voilà

    Je vous remercie

  2. #2
    Membre chevronné Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Par défaut
    Il y a plusieurs techniques de scan, il faudra que tu choisisses la ou les méthodes que tu veux employer.
    • Scan ARP. Cela ne fonctionne que pour le réseau local. L'avantage c'est qu'en général, il n'y a pas de filtrage et donc tu auras une vision complète. L'autre avantage, c'est que c'est rapide. L'inconvénient, c'est qu'il faut que tu génères les trames à la main et que tu les décodes à la main aussi. la lib winpcap est un bon point d'entrée dans ce cas pour envoyer et recevoir des trames. Il y a aussi la fonction Windows SendARP() qui peux t'aider si tu ne veux pas trop mettre les mains dans le cambouï.
    • Scan ICMP. C'est plus classique. Tu peux aussi construire des trames à la main et décoder à la main les réponses. L'usage de Winpcap est conseillé. Tu peux aussi utiliser la fonction WIN32 IcmpSendEcho(). Tu peux être tributaire d'un éventuel filtrage par la machine destination ou bien par un routeur/firewall sur la route. Par contre, tu n'es plus limité au réseau local.
    • Scan par connexion respectuese TCP. Tu ouvres (ou tentes d'ouvrir) une connexion TCP avec un socket. Si la réponse est positive, tu le sais immédiatement. Par contre, l'abscence de réponse ne signifie pas qu'il n'y a pas de machine. Tu es encore tributaire d'un éventuel filtrage sur la route et le numéro de port à tester va aussi être fonctioin de la machine cible. Sur une machine Unix, on va plutôt tester les ports 23 ou 23, sur une machine Windows, ce sera les ports 445.
    • Scan plus agressif. Je te laisse regarder du côté de nmap pour les différentes techniques possibles. Dans ce cas, il faudra mettre les mains dans le cambouï, générer tes trames à la main, décoder les réponses et utiliser la librairie WinPcap.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 87
    Par défaut
    Bonjour,

    Merci pour la réponse, je cherche une technique de scan ou je n'aurai pas trop à mettre les mains dans le cambouï. J'ai regardé la méthode sendARP, est-elle facile de l'utilisation dans une MFC ? Je ne connais pas du tout.

    En résumé dans mon MFC je voudrais que ça ce passe comme ça :

    Par exemple :

    - 1 Button pour lancer le scan du réseau local,
    - 1 Split Button Control pour sélectionner le réseau choisi.

    Le fonctionnement :

    Scanner les 255 adresses du réseau local,
    Sélectionner les adresses ip utilisés,
    Inclure les noms des pc utilisés dans le Split Button Control (Si c'est possible, ou sinon voir une autre solution) afin d'utiliser cette adresse IP pour se connecter à un serveur par sockets.

    La connexion client/serveur par sockets fonctionne de mon coté, je veux juste pouvoir scanner le réseau et sélectionner le pc choisit, au lieu d'entrer manuellement l'adresse IP.

    Je vous remercie

  4. #4
    Membre chevronné Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Par défaut
    Citation Envoyé par LuffyyffuL Voir le message
    J'ai regardé la méthode sendARP, est-elle facile de l'utilisation dans une MFC ? Je ne connais pas du tout.
    Je ne voie pas de difficulté particulière mis à part qu'il te faudra un working thread pour le scan dans ton application MFC. Si tu ne fait pas cela, tu vas figer ton affichage et cela ne sera pas très beau (de toute façon, quelque soit la méthode de scan, il te faudra un working thread auxiliaire pour faire le scan).

    Citation Envoyé par LuffyyffuL Voir le message
    JEn résumé dans mon MFC je voudrais que ça ce passe comme ça :

    Par exemple :

    - 1 Button pour lancer le scan du réseau local,
    - 1 Split Button Control pour sélectionner le réseau choisi.
    Attention, si tu choisis la méthode de scan par SendArp(), cela ne pourra être que le réseau local. Le scan ARP est limité au réseau local, c'est un scan de niveau 2 dans la couche ISO donc il ne passe pas les routeurs.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 87
    Par défaut
    Ok merci,

    C'est quoi un working thread, c'est comme une barre de progression ?

    Je veux scanner que le réseau local donc ça devrai être bon.
    Si vous avez des tutos ou exemple d'utilisation de SendArp(), je prend avec plaisir

    Merci

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 87
    Par défaut Re
    Bonjour,

    J'ai réussi à scanner le réseau avec SendARP donc je scan bien les 255 adresses du réseau local, pour chaque adresse ok, on me renvoie bien les adresses MAC, par contre le scan est très lent. Il y a t'il un moyen de faire en sorte que le scan soit plus rapide, c'est bloquant ?

    Merci

    Le code

    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
    79
    80
    81
    82
    83
    #include <winsock2.h>
    #include <iphlpapi.h>
    #include <stdio.h>
    #include <windows.h>
     
    #pragma comment(lib, "iphlpapi.lib")
    #pragma comment(lib, "ws2_32.lib")
     
    int __cdecl main(int argc, char **argv)
    {
        DWORD dwRetVal;
        IPAddr DestIp = 0;
        IPAddr SrcIp = 0;       /* default for src ip */
        ULONG MacAddr[2];       /* for 6-byte hardware addresses */
        ULONG PhysAddrLen = 6;  /* default to length of six bytes */
     
        char DestIpString[100];
    	int mac;
    	char *SrcIpString = 0;
     
        BYTE *bPhysAddr;
        int i;
     
    	/////
     
    	for (char nombre=1 ; nombre<255 ; nombre++)
    	{
     
    	sprintf (DestIpString,"172.22.1.%d",nombre);
     
    	/////
     
    	 DestIp = inet_addr(DestIpString);
     
    	 memset(&MacAddr, 0xff, sizeof (MacAddr));
     
    	  printf("Sending ARP request for IP address: %s\n", DestIpString);
     
    	  dwRetVal = SendARP(DestIp, SrcIp, &MacAddr, &PhysAddrLen);
     
    	  if (dwRetVal == NO_ERROR) {
    		   bPhysAddr = (BYTE *) & MacAddr;
    			if (PhysAddrLen) {
    			  for (i = 0; i < (int) PhysAddrLen; i++) {
    				   if (i == (PhysAddrLen - 1))
    				     printf("%.2X\n", (int) bPhysAddr[i]);
    				 else
    					   printf("%.2X-", (int) bPhysAddr[i]);
    			 }
    		 } else
    			  printf
    				 ("Warning: SendArp completed successfully, but returned length=0\n");
     
    	 } else {
            printf("Error: SendArp failed with error: %d", dwRetVal);
            switch (dwRetVal) {
            case ERROR_GEN_FAILURE:
                printf(" (ERROR_GEN_FAILURE)\n");
                break;
            case ERROR_INVALID_PARAMETER:
                printf(" (ERROR_INVALID_PARAMETER)\n");
                break;
            case ERROR_INVALID_USER_BUFFER:
                printf(" (ERROR_INVALID_USER_BUFFER)\n");
                break;
            case ERROR_BAD_NET_NAME:
                printf(" (ERROR_GEN_FAILURE)\n");
                break;
            case ERROR_BUFFER_OVERFLOW:
                printf(" (ERROR_BUFFER_OVERFLOW)\n");
                break;
            case ERROR_NOT_FOUND:
                printf(" (ERROR_NOT_FOUND)\n");
                break;
            default:
                printf("\n");
                break;
            }
        }
     
    }
        return 0;
    }

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    C'est combien de temps "très long" ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 87
    Par défaut
    Ouai, 10 min pour tout scan, mais ce sont les adresses Ip non utilisés qui sont lente à scanner, parce qu'il doit chercher l'erreur, je pense que je vais enlever le code du bas avec les erreurs.

    Par contre ce que je voudrais faire maintenant, c'est pour chaque adresse MAC reçu, récupérer le NETBIOS du PC affin de l'afficher dans un Split Button Control pour sélectionner le PC choisi.

  9. #9
    Membre très actif
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    374
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur indépendant
    Secteur : Transports

    Informations forums :
    Inscription : Août 2004
    Messages : 374
    Par défaut threads
    si tu veux vraiment accelerer les choses, la seule solution est d'en lancer une batterie en parallele, donc dans des trheads.
    regarde du coté de afxbeginthreads.
    à la sortie du thread de travail ou "WorkingThread", qui est en fait une fonction mais s'executant en parallele, tu as le resultat, que tu dois stocker pour l'adresse que tu as scanné.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 87
    Par défaut
    Bonjour,

    J'ai tester une autre méthode, en essayant de me connecter à une IP, si la connexion échoue, tester sur l'ip suivante.

    Mais ça ne fonctionne pas vraiment, par contre dans mon Edit control "infoco", j'ai le message connecté, mais la connexion n'est pas établie.

    Je sais pas trop quoi faire, une idée ??

    Merci

    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
    	int nombre=127;
    	int port2=2345;
     
    	Connection = false;
     
    	while (Connection != true)
    	{
    		CString Str;
    		Str.Format(TEXT("169.254.101.%d"),nombre);
    		nombre++;
     
    ////////////////////////////////////
     
    		if(Connection)
    	{	SockCom->Close();
    		infoco.Append(TEXT("Déconnecté... \r\n"));
    		Connection = false;
    	}  
     
     
    		SockCom->Create();
    		if(SockCom->Connect(Str,port2))
    		{	
    			infoco.Append(TEXT("Connecté... \r\n"));
    			Connection = true;
    		}
    		else
    		{	
    			int Err = GetLastError();
    			infoco.Append(TEXT("Erreur de Connexion \r\n"));
    			CString Str;
    			Str.Format(TEXT("Erreur N° %d \r\n"),Err);
    			infoco.Append(Str);
    			SockCom->Close();
    			Connection = false;
    		}
    	}
     
    	UpdateData(false);
    }
    PS : Je cherche aussi à ouvrir une page web dans mon MFC windows mobile, à partir d'un bouton.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par défaut
    Tu peux utiliser les fonctions des WinSocks et la fonction WNetOpenEnum qui énumère les connections réseaux existantes.
    Au final je ne récupère que les adresses valides.

  12. #12
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut
    salut,
    je suis intéressée par votre code , je veux intégrer un scan de réseau dans mon application , j'ai testé votre code en utilisant Dev c++, lors de compilation j'ai les deux messages d'erreur suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [26] [Warning] comparison is always true due to limited range of data type
    [39] `ULONG (*)[2]' to `long unsigned int*' for argument `3' to `DWORD SendARP(IPAddr, IPAddr, long unsigned int*, long unsigned int*)'
    j'ai pas compris comment je peux résoudre ce problème
    qlq peut m'aider ?
    merci d'avance.

Discussions similaires

  1. Scanner un PC sur le réseau local avec AntiVirus?
    Par sohaieb dans le forum Sécurité
    Réponses: 1
    Dernier message: 05/05/2011, 19h38
  2. Réseau local avec deux abonnements ADSL
    Par gibet_b dans le forum Hardware
    Réponses: 2
    Dernier message: 03/11/2008, 15h36
  3. Partage réseau local avec wifi + ping réseau local impossible
    Par pirouette_07 dans le forum Hardware
    Réponses: 1
    Dernier message: 16/01/2007, 13h42
  4. Tester la connexion d'un pc réseau local avec un ping
    Par Revan777 dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/10/2006, 11h40
  5. Configurer un réseau local avec 3 pc Win xp
    Par stkam dans le forum Développement
    Réponses: 3
    Dernier message: 26/02/2004, 19h13

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