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

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

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.