Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

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é: 4 857 / 931

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

Pour les "Membres Club", vous pouvez 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 !

Commentaires et avis

signaler à un administrateur
Commentaire de arno03 le 21/12/2004 20:00:36

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

signaler à un administrateur
Commentaire de nico23 le 21/12/2004 20:46:55

Ok, voila l'exe !

signaler à un administrateur
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 !

signaler à un administrateur
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 !

signaler à un administrateur
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 =)

signaler à un administrateur
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);

signaler à un administrateur
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 !

signaler à un administrateur
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.

signaler à un administrateur
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 ! ^^

signaler à un administrateur
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 !

signaler à un administrateur
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...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.