Enumération de pc en réseau. vc 6

3/5 (11 avis)

Vue 7 654 fois - Téléchargée 1 162 fois

Description

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 / Exemple :


///////////////////////
// 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 !

Codes Sources

A voir également

Ajouter un commentaire Commentaires
jshems
Messages postés
8
Date d'inscription
jeudi 16 février 2006
Statut
Membre
Dernière intervention
1 mars 2006

17 févr. 2006 à 11:48
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
Suisse00
Messages postés
83
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
12 octobre 2005

10 janv. 2005 à 19:35
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 !
cs_nico23
Messages postés
12
Date d'inscription
mercredi 10 mars 2004
Statut
Membre
Dernière intervention
29 décembre 2004

29 déc. 2004 à 13:03
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 ! ^^
mehdi_kh
Messages postés
6
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
17 février 2010

28 déc. 2004 à 11:19
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.
cs_nico23
Messages postés
12
Date d'inscription
mercredi 10 mars 2004
Statut
Membre
Dernière intervention
29 décembre 2004

26 déc. 2004 à 20:54
Ok merci pour vos commentaires, et c'est vrai que c'est un peu plus claire comme ca BruNews !
Afficher les 11 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.