IP Adresse aus Computername ermitteln
-
Hallo, habe Google und Suche ohne Erfolg durchforstet...
Wie kann ich aus einem Computernamen die IP Adresse ermitteln (ggfs. auch weitere Netzwerkadressdaten wie MAC, DNS usw.)?
Hiermit ermittel ich im Netzwerk alle verfügbaren Rechner:
void __fastcall TForm18::frm18_btnAktuellClick(TObject *Sender) {Integer i2; AnsiString z1,z2,zTCP,zName; Boolean o1; // Vars definieren TListItem *ListItem; // Vars definieren zName=Clienten(0,0,"",frm18_lvTabelle); // eigener Computername? Filter=Trim(frm18_edFilter->Text); // akt. Filtertext o1=Filter.Length()>0; // Angabe gemacht? z2=Filter.LowerCase(); // alles in Kleinbuchstaben LPSERVER_INFO_101 pBuf = NULL; // LPSERVER_INFO_101 pTmpBuf; // DWORD dwLevel = 101; // Infos auf Level 101 anfordern DWORD dwPrefMaxLen = -1; // DWORD dwEntriesRead = 0; // DWORD dwTotalEntries = 0; // DWORD dwServerType = SV_TYPE_SERVER; // Alle Services anfordern DWORD dwResumeHandle = 0; // NET_API_STATUS nStatus; // LPTSTR pszServerName = NULL; // Screen->Cursor=crHourGlass; // Sanduhr frm18_lvTabelle->Clear(); // Tabelle löschen nStatus = NetServerEnum(pszServerName, // Auf Level 101 Infos anfordern dwLevel, // (LPBYTE *) &pBuf, // dwPrefMaxLen, // &dwEntriesRead, // &dwTotalEntries, // dwServerType, // NULL, // &dwResumeHandle); // if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA)) { // Aufruf war erfolgreich... if ((pTmpBuf = pBuf) != NULL) { frm18_proBalken->Max=dwEntriesRead; // Balken einstellen for (int i1 = 0; i1 < dwEntriesRead; i1++) { // Application->ProcessMessages(); // events abarbeiten frm18_proBalken->Position=i1; // Balken einstellen if(o1==true) { // Filterangabe ist gemacht z1=pTmpBuf->sv101_name; // String übergeben z1=z1.LowerCase(); // Name zurück if(z1.AnsiPos(z2)==0) { goto Abbruch; } // Filtertext ist nicht enthalten, raus } // ende if(o1 z1="PC"; // Voreinstellung if (pTmpBuf->sv101_type & SV_TYPE_DOMAIN_CTRL) { z1="PDC"; } // Domain if (pTmpBuf->sv101_type & SV_TYPE_DOMAIN_BAKCTRL) { z1="BDC"; } // Backupdomain zTCP="0.0.0.0"; // HIER DIE IP ADRESSE ERMITTELN...??? ListItem = frm18_lvTabelle->Items->Add(); // neue Zeile anlegen z2=pTmpBuf->sv101_name; // Computername i2=-1; if(zName==z2.LowerCase()) { i2=51; } // eigenen PC kennzeichnen ListItem->ImageIndex=i2; // und Symbol zuordnen ListItem->Caption = IntToStr(i1); // 01 Nummer ListItem->SubItems->Add(z2); // 02 Computername ListItem->SubItems->Add(zTCP); // 03 TCP/IP ListItem->SubItems->Add(z1); // 04 Gerät ListItem->SubItems->Add(pTmpBuf->sv101_platform_id); // 05 PLattform ID ListItem->SubItems->Add(String(pTmpBuf->sv101_version_major)+"."+String(pTmpBuf->sv101_version_minor)); // 06 Version ListItem->SubItems->Add(pTmpBuf->sv101_type); // 07 Typ ListItem->SubItems->Add(pTmpBuf->sv101_comment); // 08 Kommentar/Bemerkung Abbruch: // Sprungmarke pTmpBuf++; // Zähler +1 } // ende for i1 if (nStatus == ERROR_MORE_DATA) { Application->MessageBox(("Alle Einträge: "+String(dwTotalEntries)).c_str(),"Mehr Einträge verfügbar!", MB_OK | MB_ICONSTOP); } } // ende if(pTmp } // ende (nStatus if (pBuf) { NetApiBufferFree(pBuf); } // Puffer freigeben TDateTime DateTime=Now(); // Datum und Uhrzeit speichern frm18_StatusBar->SimpleText="Letzte Aktualisierung = "+FormatDateTime("dd.mm.yyyy, hh:nn:ss",DateTime)+" Filter: "+Filter; i2=frm18_lvTabelle->Items->Count; // Anzahl Einträge frm18_lbl1->Caption="Rechner ("+IntToStr(i2)+")"; // Anzahl schreiben frm18_btnPing->Enabled=oTCP && i2>0; // Button sperren/freigeben frm18_proBalken->Position=0; // Balken einstellen Screen->Cursor=crDefault; // Pfeil }
Hier würde ich eben noch gerne die IP Adresse mit ausgeben (für PING usw.)
Grüsse, Stefan
-
[code] PHOSTENT hostinfo; if((hostinfo = gethostbyname(hostname)) == NULL) { printf("Error: Failed to get the local host!"); return false; }[/code]
weiß nur nicht, ob das im Netzwerk funzt....
-
...aber da meckert er immer wegen PHOSTENT
Habe es aber so gelöst:
//---------------------------------------------------------------------------- //----- IP ADRESSE ERMITTELN ----- //---------------------------------------------------------------------------- AnsiString IpAdresse(int p1,AnsiString pt1) {AnsiString z1; // Vars definieren if(Form1->PrgComp) { ShowMessage("Computername: "+pt1); } // nur im IDE char *Ip; // neues Char WSADATA wsaData; // WSA Strukt zuordnen struct hostent *pHostEnt; // und anlegen struct sockaddr_in tmpSockAddr; // PLatzhalter für IP Adresse WSAStartup(MAKEWORD(2,0),&wsaData); // WSA starten char hostname[25]; // neues Char strcpy(hostname,pt1.c_str()); // Computername in Char kopieren pHostEnt=gethostbyname(hostname); // Name auflösen in IP if(pHostEnt==NULL) { ShowMessage("IP_Adresse kann nicht ermittelt werden!?\r\rComputer: "+pt1); return ""; } // Fehler, Abbruch memcpy(&tmpSockAddr.sin_addr,pHostEnt->h_addr,pHostEnt->h_length); // Kopiert Speicherbereich in die Struktur Ip = NULL; // Char leeren Ip = new char[17]; // 17 Zeichen neu strcpy(Ip,inet_ntoa(tmpSockAddr.sin_addr)); // aus Struktur in Char kopieren z1=StrLower(Ip); // Char in String kopieren WSACleanup(); // WSA beenen delete [] Ip; // Char löschen return z1; // IP Rückgabe }
Gruss, Stefan