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