3/5 (11 avis)
Vue 7 654 fois - Téléchargée 1 162 fois
/////////////////////// // 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); }
17 févr. 2006 à 11:48
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
10 janv. 2005 à 19:35
29 déc. 2004 à 13:03
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 ! ^^
28 déc. 2004 à 11:19
26 déc. 2004 à 20:54
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.