begin process at 2012 02 09 13:57:50
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > ENUMÉRATION DE PC EN RÉSEAU. VC 6

ENUMÉRATION DE PC EN RÉSEAU. VC 6


 Information sur la source

Note :
5,5 / 10 - par 2 personnes
5,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Niveau :Débutant Date de création :21/12/2004 Date de mise à jour :23/12/2004 15:00:05 Vu / téléchargé :6 121 / 995

Auteur : nico23

Ecrire un message privé
Site perso
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Ce ptit prog permet de lister tous les pcs connectés sur le réseau et affiche les adresses IP de chaque poste en fonction du pc. J'utilise un thread pour l'énumération. Dev sur visual 6.

Source

  • ///////////////////////
  • // Fonction Thread
  • UINT CEnumPCDlg::ThreadEnum(LPVOID pParam)
  • {
  • CEnumPCDlg* pDlg = (CEnumPCDlg*) pParam;
  • pDlg->ThreadFct(pDlg);
  • return 0;
  • }
  • void CEnumPCDlg::ThreadFct(LPVOID pParam)
  • {
  • CEnumPCDlg* pDlg = (CEnumPCDlg*) pParam;
  • /////////////////////////////////
  • // Lance la recherche des PCs
  • // @: NULL pour tte les resources
  • EnumPCConnect(NULL);
  • }
  • ///////////////////////////////////////////////
  • // Fonction d'énumération des PCs
  • // Actions :
  • // 1/ Fonction recurente
  • // 2/ Liste dans la listCtrl : m_dxListPC
  • // 3/ Envoie de la variable Tmp correspondant au Nom du pc détecté
  • // dans la fonction SearchIP(Tmp) qui va lui associé l'adres IP
  • // 4/ Fin
  • void CEnumPCDlg::EnumPCConnect(NETRESOURCE *nr)
  • {
  • HANDLE hEnum;
  • DWORD Result;
  • Result = WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_CONTAINER, nr, &hEnum);
  • //NetResource = NULL : On enumere TOUTES les resources
  • if( Result != NO_ERROR )
  • {
  • // Error (acces interdit a cette instance)
  • AfxMessageBox("Impossible d'afficher la liste !");
  • // Si on ne veut pas continuer l'enumeration
  • return;
  • }
  • // Enumeration de toutes les resources
  • DWORD Count = -1;
  • DWORD BufferSize = 0;
  • DWORD ReturnVal = 0;
  • // Allocation de l'espace pour le tableau des resources reso
  • NETRESOURCE *NetRes = (NETRESOURCE*) new char[1024];
  • ZeroMemory( NetRes, sizeof( NETRESOURCE ) );
  • while(1)
  • {
  • ReturnVal = WNetEnumResource( hEnum, &Count, NetRes, &BufferSize );
  • if( ReturnVal == ERROR_MORE_DATA ) // On recalcul la taille du Buffer
  • {
  • Count = -1;
  • delete[] NetRes;
  • NetRes = ( NETRESOURCE* ) new char[ BufferSize ];
  • ZeroMemory( NetRes, sizeof( NETRESOURCE ) );
  • ReturnVal = WNetEnumResource( hEnum, &Count, NetRes, &BufferSize );
  • }
  • if(ReturnVal!=NO_ERROR)
  • break;
  • // Ajoute les resources dans la m_dxListConnect
  • char Tmp[100];
  • for (unsigned int i=0;i<Count;i++) // Verifie l'ensemble de toutes les resources trouver
  • {
  • if ( ( NetRes[i].lpRemoteName[0] == '\\' ) && ( NetRes[i].lpRemoteName[1] == '\\' ) )
  • {
  • // On prend ke celle comencant par '//' soit un ordinateur
  • for ( unsigned int j = 0, k = 2; j < strlen( NetRes[i].lpRemoteName ); j++, k++ )
  • Tmp[j] = NetRes[i].lpRemoteName[k];
  • int nIndex = m_dxListPC.InsertItem(0,Tmp);
  • // Lance la fonction SearchIP qui permet de déctecter l'adresse IP du destinataire
  • SearchIP(Tmp, nIndex);
  • }
  • // Necessite pour la recurrence et trouver l'ensemble des pc
  • if((NetRes[i].dwUsage & RESOURCEUSAGE_CONTAINER)==RESOURCEUSAGE_CONTAINER)
  • EnumPCConnect(&NetRes[i]);
  • }
  • if( ReturnVal == ERROR_NO_MORE_ITEMS )
  • {
  • //Terminus tous le monde descend
  • delete[] NetRes;
  • WNetCloseEnum( hEnum );
  • }
  • }
  • delete[] NetRes;
  • WNetCloseEnum( hEnum );
  • }
  • ////////////////////////////////////////////////////
  • // Fonction lancé par EnumPCConnect(...)
  • // Permet de rechercher l'adresse IP du PC: Tmp
  • // nIndex correspond au positionnemant dans la liste
  • void CEnumPCDlg::SearchIP(char Tmp[], int nIndex)
  • {
  • HOSTENT* ip_resolue;
  • SOCKADDR_IN valip;
  • int compteur;
  • char IPAdress[16];
  • // Recuperation de l'ip du destinataire
  • ip_resolue = gethostbyname(Tmp);
  • if (ip_resolue != NULL) // si c'est NULL sans doute n'est on pas connecté.
  • {
  • // recuperation du dernier entier 'compteur' tel que ip_resolue->h_addr_list[compteur] n'est pas null
  • for (compteur = 0; ip_resolue->h_addr_list[compteur+1] != NULL; compteur++)
  • { }
  • memcpy(&valip.sin_addr.s_addr, ip_resolue->h_addr_list[compteur], ip_resolue->h_length);
  • strcpy(IPAdress, inet_ntoa(valip.sin_addr) );
  • m_dxListPC.SetItemText(nIndex,1,IPAdress);
  • }
  • }
  • //////////////////////////////////////////////////////////////
  • // Fonction lancé par le bouton Actualiser de l'IHM
  • void CEnumPCDlg::OnActualiser()
  • {
  • // Efface ttes les ressources énumérées dans la list
  • m_dxListPC.DeleteAllItems();
  • // Lance le thread d'énumération des PCs connectés au réseau
  • AfxBeginThread( ThreadEnum,this);
  • }
///////////////////////
// Fonction Thread

UINT CEnumPCDlg::ThreadEnum(LPVOID pParam)
{	
	CEnumPCDlg* pDlg = (CEnumPCDlg*) pParam;
	pDlg->ThreadFct(pDlg);

	return 0;
}

void CEnumPCDlg::ThreadFct(LPVOID pParam)
{
	CEnumPCDlg* pDlg = (CEnumPCDlg*) pParam;
	
	/////////////////////////////////
	// Lance la recherche des PCs
	// @: NULL pour tte les resources

	EnumPCConnect(NULL);
}


///////////////////////////////////////////////
// Fonction d'énumération des PCs 
// Actions :
// 1/ Fonction recurente
// 2/ Liste dans la listCtrl : m_dxListPC
// 3/ Envoie de la variable Tmp correspondant au Nom du pc détecté 
//	  dans la fonction SearchIP(Tmp) qui va lui associé l'adres IP
// 4/ Fin

void CEnumPCDlg::EnumPCConnect(NETRESOURCE *nr)
{
	HANDLE hEnum;
	DWORD Result;

	Result = WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_CONTAINER, nr, &hEnum);

	//NetResource = NULL : On enumere TOUTES les resources
	if( Result != NO_ERROR )
	{                       
		// Error (acces interdit a cette instance)
		AfxMessageBox("Impossible d'afficher la liste !");
		// Si on ne veut pas continuer l'enumeration
		return;         
	}     

	// Enumeration de toutes les resources
	DWORD Count = -1;
	DWORD BufferSize = 0;
	DWORD ReturnVal = 0; 
	
	// Allocation de l'espace pour le tableau des resources reso
	NETRESOURCE *NetRes = (NETRESOURCE*) new char[1024];
	ZeroMemory( NetRes, sizeof( NETRESOURCE ) );

	while(1)
	{
		ReturnVal = WNetEnumResource( hEnum, &Count, NetRes, &BufferSize );

		if( ReturnVal == ERROR_MORE_DATA )  // On recalcul la taille du Buffer
		{
				Count = -1;
				delete[] NetRes;
				NetRes = ( NETRESOURCE* ) new char[ BufferSize ];
				ZeroMemory( NetRes, sizeof( NETRESOURCE ) );
				ReturnVal = WNetEnumResource( hEnum, &Count, NetRes, &BufferSize );
		}
		if(ReturnVal!=NO_ERROR)
			break;
			
		// Ajoute les resources dans la m_dxListConnect
		char Tmp[100];

		for (unsigned int i=0;i<Count;i++)    // Verifie l'ensemble de toutes les resources trouver
		{
			if ( ( NetRes[i].lpRemoteName[0] == '\\' ) && ( NetRes[i].lpRemoteName[1] == '\\' ) )
			{                             
				// On prend ke celle comencant par '//' soit un ordinateur
				for ( unsigned int j = 0, k = 2; j < strlen( NetRes[i].lpRemoteName ); j++, k++ )
					Tmp[j] = NetRes[i].lpRemoteName[k];

				int nIndex = m_dxListPC.InsertItem(0,Tmp);

				// Lance la fonction SearchIP qui permet de déctecter l'adresse IP du destinataire
				SearchIP(Tmp, nIndex);
			}                        
			// Necessite pour la recurrence et trouver l'ensemble des pc
			if((NetRes[i].dwUsage & RESOURCEUSAGE_CONTAINER)==RESOURCEUSAGE_CONTAINER)
				EnumPCConnect(&NetRes[i]);
		}

		if( ReturnVal == ERROR_NO_MORE_ITEMS )
		{
			//Terminus tous le monde descend
			delete[] NetRes;
			WNetCloseEnum( hEnum );
		}
	}
	delete[] NetRes;
	WNetCloseEnum( hEnum );	
}

////////////////////////////////////////////////////
// Fonction lancé par EnumPCConnect(...)
// Permet de rechercher l'adresse IP du PC: Tmp
// nIndex correspond au positionnemant dans la liste

void CEnumPCDlg::SearchIP(char Tmp[], int nIndex)
{
	HOSTENT* ip_resolue;
	SOCKADDR_IN valip;
	int compteur;

	char IPAdress[16];

	// Recuperation de l'ip du destinataire
	ip_resolue = gethostbyname(Tmp);

	if (ip_resolue != NULL) // si c'est NULL sans doute n'est on pas connecté.
	{
		// recuperation du dernier entier 'compteur' tel que ip_resolue->h_addr_list[compteur] n'est pas null
		for (compteur = 0; ip_resolue->h_addr_list[compteur+1] != NULL; compteur++)
		{ }

		memcpy(&valip.sin_addr.s_addr, ip_resolue->h_addr_list[compteur], ip_resolue->h_length);

		strcpy(IPAdress, inet_ntoa(valip.sin_addr) );
		m_dxListPC.SetItemText(nIndex,1,IPAdress);
	}
}

//////////////////////////////////////////////////////////////
// Fonction lancé par le bouton Actualiser de l'IHM

void CEnumPCDlg::OnActualiser() 
{
	// Efface ttes les ressources énumérées dans la list
	m_dxListPC.DeleteAllItems();
	
	// Lance le thread d'énumération des PCs connectés au réseau
	AfxBeginThread( ThreadEnum,this);
}

 Conclusion

Si ya des commentaires sur le code, améliorations, critiques ... c'est ici !

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

21 décembre 2004 20:51:37 :
Ajout de l'executable en download.
21 décembre 2004 20:57:20 :
Modification du fichier compressé : Projet + .exe
23 décembre 2004 15:00:06 :
Amélioration des commentaires dans les sources ( voir dans le fichier EnumPCDlg.cpp ) Affichage des fonctions d'énumération et de GetIP sur le site directement !

 Sources du même auteur

Source avec Zip Source avec une capture BACKGROUND IMAGE [MFC VC++]
Source avec Zip Source avec une capture OPACITY SOFT MFC ( JOUE SUR LES EFFETS DE TRANSPARENCE )

 Sources de la même categorie

Source avec Zip SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas
Source avec Zip Source avec une capture SECURE REMOTE SHELL [WIN32] par ganjarasta
Source avec Zip Source avec une capture SUIVI DE PRODUCTION ONDULEUR PHOTOVOLTAÏQUE SOLARMAX par brunovan
Source avec Zip MINICHAT MULTI-CLIENT par wisar
SOCKET CPP par baptchr55

Commentaires et avis

Commentaire de arno03 le 21/12/2004 20:00:36

serait-il possible d'avoir un exe siltoplé ? :)

Commentaire de nico23 le 21/12/2004 20:46:55

Ok, voila l'exe !

Commentaire de minet03 le 22/12/2004 18:36:31

Le programme est utile, certe. Mais il me semble que le site est là pour poser des sources pour comprend comment marche le prog. Mais là bizard je ne comprend pas un poil tes sources.
Les commentaires sont en anglais (bon ça, ça passe encore). Mais le truc c'est que les fonctions principale de ton prog (récupérer les IP des ordi en réso) est introuvable. Le code n'est donc pas très clair.
Essay d'amélioré ça stp !

Commentaire de nico23 le 23/12/2004 15:09:24

Les commentaires du code en anglais sont ceux générés par visual 6. Les fonctions qui t'intéressent sont maintenant dans la partie code du post.
J'espere que ca ira !

Commentaire de Thaeron le 25/12/2004 09:27:01

Evidement minet03 tu n'as jamais utilisé les MFC, sinon tu aurais remarqué le code type (long, moche et incompréhensible généré par Vc++).
Je trouve ton code sympas nico23, je ne comprenais pas le principe au départ, et après lecture du code tout s'est éclairci et je comprend pourquoi il ne tourne pas sous GNU/Linux avec Wine.
Bonne continuation =)

Commentaire de BruNews le 25/12/2004 17:51:40 administrateur CS

Salut,
tu pourrais supprimer: char Tmp[100]; et sa vilaine boucle de recopie.
envoie direct:
m_dxListPC.InsertItem(0,NetRes[i].lpRemoteName + 2);
SearchIP(NetRes[i].lpRemoteName + 2, nIndex);

Commentaire de nico23 le 26/12/2004 20:54:53

Ok merci pour vos commentaires, et c'est vrai que c'est un peu plus claire comme ca BruNews !

Commentaire de mehdi_kh le 28/12/2004 11:19:48

pouvez vou m'expliquer le principe de votr programme? G essayer de le comprendre mai c 1 peu difficile. ca mintéresse de savoir le principe de ton programme et  le démarche, la conception... et merci bocou.

Commentaire de nico23 le 29/12/2004 13:03:46

Salut,

Le principe de ce programme :
Il est de pouvoir scanner le réseau à partir du pc d'où tu as lancé l'application.
A chaque pcs détectés pendant le scan, le programme effectue instantanément une recherche de son adresse ip sur le réseau.

Le code :
Pour ce programme, j'utilise l'IDE Visual C++ 6, le projet est de type boite de dialog.
Ensuite pour l'IHM, je crée mes propres controles ( listCtrl, Boutons ). Je défini mes variables avec l'assistant AppWizard.
Je crée des fonctions membres : de threads, Enumération ...
Je les implémentent et je compile !

Pourquoi Utilisé un thread ?
Tout simplement parce que la fonction d'énumération restrécusive et qu'elle ne sort de sa propre fonction que lorsqu'elle a fini le scan, ainsi j'évite certain bug dedouble appel.

A quel moment je le lance mon thread ?
Je lance un thread de recherche au début de l'application, dans la fonction InitDialog et aussi à partir du bouton actualiser.

Quel sont les bugs connus ?
Defois, il arrive que le scan ne fonctionne pas et donc que la list reste vide !
Solution : Relancer le prog !

J'espère que le prog te semble plus comme ca maintenant mehdi_kh, si ya des pbs, n'hésite pas ! ^^

Commentaire de Suisse00 le 10/01/2005 19:35:55

Ses bizzard il trouve bien le nom de mes trois ordinateur, mais on dirais qu'il ne veut pas trouver l'ip de l'ordinateur brancher par Ethernet, l'ordinateur connecter via Wireless par de problème !

Commentaire de jshems le 17/02/2006 11:48:13

salut nico23
Il est trés intéressant ton code et marche impect.
je voudrais savoir s'il serait possible d'utiliser ton code pour scanner les ordis présent sur un réseau wifi, et quels modifications pensez-vous necessaire.
merci d'avance

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

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

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

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