2Danke
ERLEDIGT
JA
JA
ANTWORTEN
5
5
ZUGRIFFE
216
216
EMPFEHLEN
-
17.08.11 12:23 #1
Hey Leute!
Ich bin etwas am verzweifeln, da ich hier ein kleines problem habe..
Ich programmiere gerade unter linux.. das programm soll später auf einem linux server (aber vlt. auch mal auf einem win server) laufen. Es soll aber nur laufen, wenn es auf einem bestimmten server liegt.
Also soll beim start des programms geprüft werden, welche (interne) IP der host gerade hat.
Ich möchte dafür nicht unbedingt extra einen socket auf machen... wenn das aber im endeffekt doch die einfachste lösung ist, werde ich das wohl tun.
(dass ich keine system calls verwenden will ist glaube ich logisch wegen linux <-> win)
Bislang habe ich es mitundCode :1
gethostname
versucht. Da bekomme ich auch den korrekten host namen, allerdings immer nur die loopback adresse 127.0.0.1. Das nützt mir nicht viel..Code :1
gethostbyname
Auf einem der server habe ich 4 interfaces.
lo, eth1, eth0 und bond0.
Mich interessiert die IP von bond0.
Gibt es eine Möglichkeit das ganze schnell und einfach mitzu lösen oder werde ich es mit einem socket und dem veraltetenCode :1
gethostbyname
versuchen müssen?Code :1
SIOCGIFCONF
Es wäre schön, wenn mir jemand einen Rat hätte.
Für den Fall dass es jemand interessiert, hier den gethostbyname code:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
string returnVal; char temp[255]; gethostname(temp,sizeof(temp)); const hostent* host_info = NULL; struct in_addr addr; host_info = gethostbyname(temp); returnVal = temp; cout << returnVal << endl; int i=0; while (host_info->h_addr_list[i]) { addr.s_addr = *((long*)host_info->h_addr_list[i++]); cout << inet_ntoa(addr) << endl; };
Vielen Dank im Vorraus!Wer im Steinhaus sitzt, sollte nicht mit Gläsern werfen !
-
17.08.11 12:40 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.Deine Aufgabe ist allerdings ziemlich systemabhängig, du wirst also nicht darum herumkommen.
Das ist klar. DNS Anfrage -> /etc/hosts -> localhost == 127.0.0.1 / ::1
Nein. (es sei denn du stellst localhost in der /etc/hosts auf die gewünschte IP um...
)
Du müßtest alle Interfaces enumerieren und prüfen ob ein Interface die bestimmte IP Adresse besitzt.
Dazu könntest du z.B. Pcap bzw. WinPcap verwenden:
http://www.winpcap.org/docs/docs_412...cap__tut1.html
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
18.08.11 14:37 #3
Okay, dann ändere ich jetzt eben die localhost adresse der server.... moment...

Ich habe mich jetzt mal in pcap eingelesen und es gefällt mir was ich da lese!
Da ich nur die lokalen devices brauche, habe ich es jetzt mit int
versucht..Code :1
pcap_findalldevs( pcap_if_t ** alldevsp, char * errbuf )
das merkwürdige ist, dass ich "0" als returnvalue bekomme... also alles geklappt haben sollte, aber alldevsp ist dennoch leer..
Eine Idee?
Ich habe Version 1.1.1 von der libpcap. Die pcap/pcap.h inkludiert und die libpcap.a statisch eingebunden.
Eigentlich müsste alles passen?!Geändert von zoidberger (18.08.11 um 14:57 Uhr)
Wer im Steinhaus sitzt, sollte nicht mit Gläsern werfen !
-
18.08.11 15:17 #4
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
18.08.11 15:22 #5
okay.. ja, ich muss root sein. God damnit..
naja, dann kann ich diese Lösung vergessen. Die applikation wird auf den Server niemals als root ausgeführt. Okay, dann mach ichs eben doch mit ioctl und nem socket :-/
Warum kann denn nicht mal was einfach so klappen ohne stundenlang irgendwelche bibliotheken zu suchen und rumzuprobieren
//Edit: also ja, es hat funktioniert, als ich es als root ausgeführt hab!Wer im Steinhaus sitzt, sollte nicht mit Gläsern werfen !
-
06.09.11 16:40 #6
falls es jemanden interessiert:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
// get all interfaces struct ifreq buffer[32]; struct ifconf intfc; struct ifreq *pIntfc; int i, fd, num_intfc; intfc.ifc_len = sizeof(buffer); intfc.ifc_buf = (char*) buffer; if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket() failed"); return 1; } if (ioctl(fd, SIOCGIFCONF, &intfc) < 0) { perror("ioctl SIOCGIFCONF failed"); return 1; } // compare ip_list with ips of host pIntfc = intfc.ifc_req; num_intfc = intfc.ifc_len / sizeof(struct ifreq); bool start_allowed = false; for (i = 0; i < num_intfc; i++) { struct ifreq *item = &(pIntfc[i]); //cout << "Interface # " << i << " -> " << item->ifr_name << ": IP " << inet_ntoa(((struct sockaddr_in *)&item->ifr_addr) if (iplist.count(inet_ntoa(((struct sockaddr_in *)&item->ifr_addr)->sin_addr)) != 0) { start_allowed = true; break; } } // if current host IP is not in the list of allowed IPs, // dont start the program. if (!start_allowed) exit(1);
iplist ist ein stl set<string>..
eingebunden hab ich die header files, die eben für AF_INET usw. benötigt sind.
danke für eure hilfe
Wer im Steinhaus sitzt, sollte nicht mit Gläsern werfen !
Ähnliche Themen
-
Interne Php-Datei auslesen
Von Vousak im Forum PHPAntworten: 4Letzter Beitrag: 23.01.11, 18:57 -
ModRewrite - adresse.de/php-seiten ohne Endung und adresse.de/Benutzer
Von Kalma im Forum Hosting & WebserverAntworten: 3Letzter Beitrag: 11.11.09, 12:49 -
Ersatz für Proxy / interne "Host-Umleitung"
Von fanste im Forum Linux & UnixAntworten: 5Letzter Beitrag: 07.07.09, 16:40 -
MAC-Adresse auslesen ohne aktiviertem "Ethernetadapter"
Von Hubi31 im Forum C/C++Antworten: 0Letzter Beitrag: 18.04.08, 12:47 -
IP und Host - Adresse
Von Cusco im Forum PHPAntworten: 5Letzter Beitrag: 19.11.07, 17:09





Zitieren

Login






