Lokale Adresse auslesen?





  • kingruedi schrieb:

    doch findet man in der FAQ

    Es geht nicht darum eine IP Adresse des Rechners herauszufinden, sondern die IP Adresse, die für eine bestimmte Verbindung benutzt wird, von der du nur einen fd hast.



  • schau dir mal getpeername an.



  • Also, ich habs jetzt mit getsockname und getpeername probiert, aber ich bekomme immer die falsche addresse. kann das an dem router liegen?

    danke, ihr habt mir schon weiter geholfen, aber:

    also das ganze ist ja so:

    ftpclient --internet--> router --(weitergeleitet durch die virtueller-server-oder-wie-sich-das-nennt funktion)--> mein-ftp-server

    und der server gibt immer nur die ip meines eigenen rechners (also 192.168.0.1) und nicht die ip, zu der client verbunden hat, zurück. WIE mache ich das also? *lieb guck*

    char *socket_client::localname() {
     struct sockaddr_in *n = new struct sockaddr_in;
     int l = sizeof(struct sockaddr_in);
     getsockname(sock, (sockaddr*)n, (socklen_t*)&l );
    
     return( inet_ntoa( n->sin_addr ) );
    }
    

    das ist jetzt so meine funktion dafür... sock ist das socket_fd

    udn desweiteren möchte ich noch fragen, wie kann ich unter windows ein socket auf non-blocking bzw. blocking umstellen?



  • Dein Ftp-Server ist gar nicht direkt im Internet, sondern über einen NAT-Router? Wenn ja, dann ist alles in Ordnung, und der Router ist dafür zuständig die Adresse, die du zurückgibst, richtig zu setzen.

    Welche Adressen hat denn dein Server laut "ip -f inet addr show" ?



  • linux:/home/Foo # ip -f inet addr show
    1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
    2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100
    inet 192.168.0.1/16 brd 192.168.255.255 scope global eth0

    also, das ist die ausgabe davon, und wie man sieht, ist dort nur meine lokale addresse angegeben, nirgendswo ist die vom router erwähnt...

    NAT(?)-Router?



  • Das ist also völlig korrekt. Es ist auch korrekt, daß dein Server nur die 192.168.0.1 sieht. Wenn du mal auf dem Server ethereal startest und dir die Pakete anschaust, die zwischen Client und Server ausgetauscht werden, sollte klar werden, warum der Server nur 192.168.0.1 ist.

    Antworte mal mit dem PASV und 192.168.0.1. Wenn beim Client wieder die 192.168.0.1 ankommt, ist der Router entweder minderwertig oder falsch konfiguriert. Ist das ein Linux Rechner?

    Des weiteren solltest du dich über die Funktionsweise von NAT informieren.



  • Der Router is kein Rechner, nur solch kleiner Kasten ^^

    Mh, ich werd das mal mit Etherreal probieren.

    Was soll der denn ersetzten? Ich mein, wenn der PASV 192,168,0,1,x,y sendet, das darf der router doch eigentlich nicht ändern oder? ist doch "data"



  • -Foo- schrieb:

    Der Router is kein Rechner, nur solch kleiner Kasten ^^

    Mh, ich werd das mal mit Etherreal probieren.

    Was soll der denn ersetzten? Ich mein, wenn der PASV 192,168,0,1,x,y sendet, das darf der router doch eigentlich nicht ändern oder? ist doch "data"

    Wenn er gut ist, wird er dir das ersetzen. Mit dem richtigen Modul macht ein Linux NAT Router genau dieses.



  • Also, da ersetzt niemand etwas -.-

    Nur, es muss ja auch so gehen irgendwie, weil mit vsFtpd geht das ja auch ohne probleme, nur werd ich aus dem Source nicht schlau...

    Also irgendwie muss ich meine ip doch ermitteln können...



  • Hast du dir mit ethereal angeschaut, was vsFtpd schickt?



  • grml, jetzt ja...
    ok, vsFtp schickt auch 192,168,0,1,x,y und der router ändert das tatsächlich. aber bei meinem programm tut es das nicht... lag vielleicht daran, dass der das nur auf port 21 ändert? weil, jetzt hab ich mein programm mal auf port 21 gestartet und: wunderbar, funktioniert, ändert der router... hmpf, und dafür dödel ich zwei tage daran rumm...

    danke, nun muss ich sehen das ich ins bett komme, morgen is schule -.-


Anmelden zum Antworten