[c++] inet_ntoa liefert falsche IP

Hey Leute, habe hier einen kleinen Server geschrieben der soweit einwandfrei funktioniert... ich würde nun gerne die Ip adresse der Clients speichern.

Ich habe dazu eine Funktion geschrieben die dies eigentlich übernehmen sollte.

Code:
int client::get_ip(SOCKADDR_IN addr)
{
    char *ip;
    ip = '\0';
    ip = inet_ntoa(addr.sin_addr);
    if(ip == '\0')
    {
        cout<<"Fehler beim speichern der Ip: "<<WSAGetLastError()<<endl;
        return 1;
    }
    else
    {
        ip_adress = ip;
        cout<<"ip_adress: "<<ip_adress<<endl;
        return 0;
    }
}

aufrufen tue ich die funktion so:

Code:
rc=recvfrom(clients[i],buf,256,0,(SOCKADDR*)&remoteAddr,&remoteAddrLen);
new_client.get_ip(remoteAddr);

Eigentlich müsste ich nun die Ip des neu verbundenen Clients in "ip_adress" stehen haben, allerdings steht dort eine beliebige ip ( immer die selbe).

Zu erwarten wäre doch, dass dort, wenn ich den client von meinem rechner aus connecte, entweder die 127.0.0.1 steht, wenn ich auf localhost connecte, oder meine internet ip, wenn ich auf meinen hostname connecte ...

Wäre für Hilfe wirklich sehr dankbar, da mir google hier nicht weitergeholfen hat, wenn man dort fündig wird geht es immer darum die eigene IP abzurufen, nicht aber die IP eines clients.
 
Code:
rc=recvfrom(clients[i],buf,256,0,(SOCKADDR*)&remoteAddr,&remoteAddrLen);

Tjoa spontane Vermutung: Der Client sendet falsch oder desynchronisiert. Sowas gehört in ein vernünftiges Protokoll, btw ;)

Klassenmember ohne this zu benutzten ist auch ziemlich schlechter Stil, da so nicht mehr erkennbar ist, ob etwas eine lokale oder objektglobale Variable ist... ip_adress ist doch eine Objektvariable, oder?

<Behauptung: Du könntest auch einfach getpeername() benutzen>
 
oh ja getpername() ist natürlich die viel elegantere lösung .... sehr gut danke schön ! Wusste auch das es da noch was gab, aber wusste nicht mehr was...
 
Zurück
Oben