PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mit C prog. IP des rechners herausfinden



mithras
04-09-2002, 11:49
Hallo,
kann ich in einem C Programm herausfinden welche IP der Rechner hat, auf dem das Prog. ausgeführt wird, wenn ja wie?

peschmae
04-09-2002, 11:53
wozu?

kannst du nicht auch evtl. die IP von "localhost" verwenden (127.0.0.1)

MfG Peschmä

mithras
04-09-2002, 12:07
ne, das muss schon die gültige IP sein, mit der der rechner auch im netz angesprochen wird!

tkortkamp
04-09-2002, 12:43
#include <stdio.h>
#include <sys/ioctl.h>
#include <string.h>
#include <net/if.h>
#include <arpa/inet.h>

int printIP(const char *interface)
{
struct ifreq ifr;
struct sockaddr_in *addr_ptr;
int sock_fd;

if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
return -1;

memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, interface);
if(ioctl(sock_fd, SIOCGIFADDR, &ifr) == 0)
{
addr_ptr = (struct sockaddr_in *) &ifr.ifr_addr;
addr_ptr->sin_family = AF_INET;
printf("Interface: %s IP: %s\n", interface,
inet_ntoa(addr_ptr->sin_addr));
return 0;
}

return -1;
}


int main(int argc, char** argv)
{
if( argc < 2 )
{
printf("USAGE : getip <INTERFACE>\n");
return -1;
}

if(printIP(argv[1]) != 0)
{
printf("Unknown error!\n");
return -1;
}

return 0;
}

Kompilieren mit: gcc -o getip getip.c
Starten mit z.B.: ./getip eth0
Ausgabe: Interface: eth0 IP: 192.168.0.2

c ya,
Tobias

mithras
05-09-2002, 06:50
thx, ager gibts aucn ne Möglichkeit die ip von nem rechner zu erfragen, ohne dass ich dem proggi das device der netzwerkkarte übergeben muss?

anda_skoa
05-09-2002, 09:57
Naja, ein Rechner hat ja keine IP Adresse, sondern seine Interfaces.

Eventuell bekommst du alle verfügbare mit getaddrinfo, wenn der node Parameter NULL ist.
man 3 getaddrinfo

Ciao,
_

mithras
05-09-2002, 14:56
Hallo,

ich möchte dass bei unterem code, nicht die angegebne ip verwendet wird, sondern die ip die der rechner hat, auf dem das programm ausgeführt wird. das also die ip automatisch abgefragt und dort eingertagen wird. Es sollte jedoch bei Programmstart kein Argument übergeben werden!








int connecten(char *text)
{

int sock;
struct sockaddr_in client;

client.sin_family = AF_INET; // Struktur in der Infos wie IP, Port Protokoll gespeichert sind, bzw. dann entnommen werden
client.sin_port = htons(2003); // Diese Struktur ist in <sys/socket.h> definiert | htons wandelt die Zahl vom Port um
client.sin_addr.s_addr = inet_addr("192.168.0.10"); // die ip des Servers



if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) // Socket wird erstellt
{
puts("Fehler beim Erstellen des Socket 1!\n");

return 1;
}
else
{
puts("\nSocket 1 wurde erfolgreich erstellt!");
// puts("Warte auf Connection!");
}


if (connect(sock, &client, sizeof(client)) < 0) // Es wird zum Server connected
{
puts("connect() 1 failed!");
}

else
{
puts("Connect 1 war erfolgreich!");
puts("Zielrechner 1 ist online!");
senden(sock, text);
}

return 0;
}

anda_skoa
05-09-2002, 15:16
wenn du auf den lokalen Rechner connecten willst, ist es doch am einfachsten du nimmst 127.0.0.1, also die Adresse dess loopback Interfaces.

Ciao,
_

mithras
05-09-2002, 15:32
nei!
das geht leider nicht, ich muss die ermittelte ip anschliesend versenden, das muss schon die richtige ip sein, mit der der rechner auch im lan angespochen wird!

anda_skoa
05-09-2002, 16:00
Hmm, ich weiß jetzt nicht wie das mit den C Befehlen geht, aber normalerweise kann man bei einem schon verbundenen Socket, die Adressen beider Enden abfragen.

Wenn du also wohin connectest, um die Adresse jemande mitzuteilen, dann könnte man diesen Socket Fragen, welche IP das lokale Ende hat.

Hast du schon probiert, was getaddrinfo bringt, wenn node NULL ist?

Ciao,
_

mithras
05-09-2002, 17:19
sorry aber getaddrinfo sagt mir jetzt überhauptnichts. Wär nett wenn du mir sagen würdest, wie ich das verwenden kann.

Ja stimmt, man kann infos über seinen verbundenen partner abfragen, das geht aber bei mir nicht, da ich mit mehreren clients arbeite...

anda_skoa
05-09-2002, 19:24
Original geschrieben von mithras
sorry aber getaddrinfo sagt mir jetzt überhauptnichts. Wär nett wenn du mir sagen würdest, wie ich das verwenden kann.


Hmm, hab da nur beim Stöbern in den man pages gefunden, hab leider kein Beispiel dazu.



Ja stimmt, man kann infos über seinen verbundenen partner abfragen, das geht aber bei mir nicht, da ich mit mehreren clients arbeite...

Ich glaube ich verstehe die Situation nicht ganz.

Wer kommuniziert da mit wem und wem mußt du die IP mitteilen?

Ciao,
_

mithras
06-09-2002, 08:55
ein client kommuniziert mit einenm server (alles tcp basis), der client soll seine eigene ip mitschicken und zwar an den server, dieser leitet die daten an andere clients weiter!

Und daher muss ich jetzt das irgendwie hinkriegen, dass der client, die ip des rechners, auf dem er ausgeführt wird ausliest udn dann mitverschickt!

anda_skoa
06-09-2002, 10:03
Aber sobald du connected hast, weiß der client ja die IP seines sockets, oder?

Wie schon gesagt, ich weiß nicht wie das in C geht, aber wenn ich zB in Java oder Qt einen TCP Verbindung zu einem Server aufbaue, kann ich ganz leicht feststellen, welche IP ich lokal dafür benutze.

Bzw kann der Server ja von sich aus feststellen, welche IP der Client hat, sobald er den Socket mit accept erzeugt.

Man muß sich dabei aber klar machen, dass das eine andere IP sein kann.
Wenn der Rechner hinter einem Router/Firewall mit NAT sitzt, sieht er eine andere lokale IP als der Server als Remote IP sieht.

Nehmen wir als Beispiel ICQ.
Bei licq wird angezeigt, wie die IP des Gegenübers ist.
Ist der hinter einer solchen Firewall, stehen beide IPs da in der Form ExterneIP/InterneIP

Wenn ein andere Client jetzt eine DirectConnect machen möchte, muß er die externeIP benutzen, außer er hat selber die selbe externe IP.
dann befindet er sich ja offensichtlich hinter der selben Firewall und kann die InterneIp benutzen.

D.h. selbst wenn du die Adressen sämtlicher Interfaces eines Rechners lokal ermittelst, muß die von außen sichtbare Adresse noch lange nicht dabei sein.

Ciao,
_

mithras
06-09-2002, 10:11
jo da hast du natürlich recht.
Aber wo das System zum Eindatz kommt (in nem Uni-Netzwerk) da würde es keine Probs. mit einer Firewall/Proxy etc geben. Muss mal schauen, ich krieg das schon irgendwie hin, wobei ich derzeit sowieso einen anderen Weg gehe.

sehe gerade dass du Telematik studierst, was'n das für ein Fach?

anda_skoa
06-09-2002, 10:15
Original geschrieben von mithras
jo da hast du natürlich recht.
Aber wo das System zum Eindatz kommt (in nem Uni-Netzwerk) da würde es keine Probs. mit einer Firewall/Proxy etc geben. Muss mal schauen, ich krieg das schon irgendwie hin, wobei ich derzeit sowieso einen anderen Weg gehe.


Dann ist es wahrscheinlich am einfachste, wenn der Server bei seinem Socket der Verbindung nachsieht, welche IP die Remote Seite hat.



sehe gerade dass du Telematik studierst, was'n das für ein Fach?

Das ist eine Kombination von Informatik und Nachrichtentechnik/Elektronik.
Wobei man da selber seine Schwerpunkte setzten kann.
Meiner ist da Informatik und da Softwareentwicklung.

Ciao,
_

mithras
06-09-2002, 10:17
sagmal kann man das auch anner FH studieren?

anda_skoa
06-09-2002, 10:49
FH Klagenfurt AFAIK

Ciao,
_