IP herausbekommen



  • sockaddr ist die "oberklasse" für jede Art von Adressen (es gibt ja nicht nur IP!). Um welche es sich handelt steht ja dann in "sin_family" drin! Daraufhin kann man dan entsprechend auf den anderen Typ casten...
    Also, wenn sin_family ein "AF_INET" ist, dann kannst Du es getroste in sockaddr_in casten...



  • Juhu! Ich habs kapiert! Nur eins noch: wenn ich inet_ntoa benutze um die Adresse in die IP umzuwandeln, krieg ich immer als IP: 88.255.34.0. Mehrere Leute haben schon auf den Server zugegriffen und dann kommt immer diese IP bei mir.



  • Dann hast du einen Fehler in deinem Code.



  • Nur ein Teilauszug:

    // Wait for incomming connections
    bool SOCKET_Server::run()
    {
        if(listen(acceptSocket, 100) == SOCKET_ERROR)
        {
            printf("Not enough rights to act as a server!\n");
            return false;
        }
        printf("Waiting for incomming connections...\n");
    
        while(true)
        {
            in_addr saddr;
            connectedSocket = accept(acceptSocket, (SOCKADDR *) &saddr, NULL);
            printf("Incomming Connection...");
            if(connectedSocket == INVALID_SOCKET)
            {
                printf(" Could not accept the incomming connection!\n");
                continue;
            }
            printf(" Connection accepted. ");
            char *IP = inet_ntoa(saddr);
            printf("(%s)\n", IP);
            closesocket(connectedSocket);
        }
    
        return true;
    }
    

    Jetz greif ich auf mich selbst zu und dann müsste kommen:
    Incomming connection... Connection accepted. (89.57.10.171)

    Dort kommt aber jetzt(schon wieder anders als vorhin:
    Incomming connection... Connection accepted. (192.253.34.0)



  • Dann musst Du doch mal "getpeername" probieren...
    Vermutlich liege ich doch falsch und man muss explizit "getpeername" aufrufen... falls dies so ist, möchte ich mich entschuldigen...



  • Also bei getpeername kommt das selbe raus. Wenn ich das ganze jetzt aber mit OpenWatcom statt mit Dev-C++ kompiliere kommt da nicht mehr die IP von vorhin, sondern: 81.0.0.0. Und ich denke mir die 81 soll hier die Portnummer sein:

    // Start Winsocket 2.0, create the socket and bind it to a port
    bool SOCKET_Server::start(int portnumber)
    {
        // Start Winsocket 2.0
        WSAStartup(MAKEWORD(2, 0), &wsa);
        printf("Winsocket 2.0 startet...\n");
    
        // Create the socket for accepting connections
        acceptSocket = socket(AF_INET, SOCK_STREAM, 0);
        if(acceptSocket == INVALID_SOCKET)
            return false;
        printf("Socket for incomming connections created...\n");
    
        // Bind the socket to a port
        memset(&addr, 0, sizeof(SOCKADDR_IN));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(portnumber);
        addr.sin_addr.s_addr = ADDR_ANY;
        if(bind(acceptSocket, (SOCKADDR*) &addr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
            return false;
        printf("Socket binded to port: %d\n", portnumber);
    
        return true;
    }
    
    ...
    
    // Try to start the server on port 81
    server.start(81);
    server.run();
    


  • Du solltest auch den passenden Datentyp nehmen!!!
    ALso bitte kein in_addr sondern ein sockaddr oder aockaddr_in!!!



  • Wenn ich als Datentyp sockaddr nehme, nimmt inet_ntoa den wieder nicht an und casten kann man das auch nicht. Und wenn ich sockaddr_in nehme und bei inet_ntoa saddr.sin_addr lässt sich das ganze zwar kompilieren, aber da steht wieder eine IP, die nicht stimmt.



  • Du solltest für "accept" ein "sockaddr_in" nehmen und für "inet_ntoa" den member "sin_addr" aus dem "sockaddr_in"...



  • Wenn ich das so mache, kommt immernoch eine falsche IP. Kann es daran liegen, dass ich hinter einem Router bin?

    Also der Port den in benutze(81) ist freigegeben.



  • Nein, der Router dürfte damit nichts zu tun haben... es ist ja eine eingehende Verbindung und keine Ausgehende...



  • 192.253.34.0 sieht mir nach deiner LAN ip aus. Wenn du zB hinter einem router sitzt und auf dich selbst zugreifst macht er einfach einen loopback ohne vorher über den router deine WAN ip anzunehmen.

    zugeben hab nicht alles hier gelesen wenns nicht passt ignorier mich einfach 😉

    mfg ch



  • Also, das ist auch nicht meine LAN-IP. Und die IP ändert sich jedes mal wenn ich neu kompiliere.



  • Jochen Kalmbach schrieb:

    Hmmm.... und was enthält die "struct sockaddr"?
    http://msdn.microsoft.com/library/en-us/winsock/winsock/accept_2.asp
    http://msdn.microsoft.com/library/en-us/winsock/winsock/sockaddr_2.asp

    PS: Wer nicht in der Lage ist aus einer "sockaddr" eine "lesbare" IP zu machen, sollte mit dem Programmieren aufhören...

    Tönst ja auch immer ganz schön rum....bist bestimmt schon Millionär...



  • Jochen Kalmbach schrieb:

    Der Kommentar war nicht auf Dich bezogen... sondern auf die Behauptung, dass "accept" die Adresse nicht zurückliefert...
    Das Beispiel zur Umwandlung von sockaddr in einen String ist aber hier drin:
    http://msdn.microsoft.com/library/en-us/winsock/winsock/sockaddr_2.asp
    (inet_ntoa)

    noch besser...
    voll debil der Typ...
    aber auch hier nur unmaßgebliche,satirische Anmerkungen ohne die Absicht der Beleidigung!



  • Ich würde getnameinfo benutzen. Das funktioniert nämlich auch mit IPv6.



  • getnameinfo liefert in den ersten der out-parameter den Namen des Computers, der Zugriff verlangt und im zweiten den Zugriffsport. Mehr aber auch nicht!



  • NI_NUMERICHOST



  • Das funktioniert auch mit NI_NUMERICHOST nicht. Aber könnte es nicht sein, dass das ganze überhaupt nicht funktionieren kann?? Bei PHP auf Websiten, funktioniert das, glaube ich, nur, weil da der Server ein Request an den Browser sendet. Dann wäre es ja nur möglich, dass der Client seine eigene IP ermittelt und an den Server sendet 💡 .

    Und jetzt noch eine andere Frage und diese wurde schon sehr oft falsch beanwortet oder ich habe noch keine richtige Antwort gefunden:

    Wie ermittelt man seine Internet-IP, wenn man hinter einem Router steht oder in einem Netzwerk ist? Es gibt zwar sehr viele Beispiele dazu, da bekomme ich aber immer nur meine LAN-IP.



  • Hi Dr. C++, du hast folgendes geschrieben:

    connectedSocket = accept(acceptSocket, (SOCKADDR *) &saddr, NULL);
    

    Der dritte Parameter darf allerdings nicht NULL sein, sondern muss der Größe des Structs SOCKADDR entsprechen, wobei ein Pointer erwartet wird:

    int length = sizeof(SOCKADDR);
    connectedSocket = accept(acceptSocket, (SOCKADDR *) &saddr, &length);
    

    Gruß
    chan95


Anmelden zum Antworten