Eigene IP auslesen



  • Vielen Dank,

    es scheint aber ein fehler darin zu sein,
    ich finde Ihn aber nicht..
    hier der source:

    #include <iostream>
    #define NUM_ELEMENTS(x)  (sizeof((x)) / sizeof((x)[0])) // Für IP auslesen 
    using namespace std;
    
    BOOL IP_auslesen(char* IP_ADRESSE)
    { 
      struct    hostent* h; 
      WSADATA   wsaData; 
      UCHAR     ucAddress[4]; 
      CHAR      szHostName[MAX_PATH]; 
      int       x;   
    
        WSAStartup(MAKEWORD(1, 1), &wsaData); 
        if(SOCKET_ERROR != gethostname(szHostName, NUM_ELEMENTS(szHostName))) 
        { 
            if(NULL != (h = gethostbyname(szHostName))) 
            { 
                for(x = 0; (h->h_addr_list[x]); x++) 
                { 
    
                    ucAddress[0] = h->h_addr_list[x][0]; 
                    ucAddress[1] = h->h_addr_list[x][1]; 
                    ucAddress[2] = h->h_addr_list[x][2]; 
                    ucAddress[3] = h->h_addr_list[x][3]; 
    
                    wsprintf(IP_ADDRESSE, "%d.%d.%d.%d", ucAddress[0], ucAddress[1], ucAddress[2], ucAddress[3]); 
                } 
            } 
        } 
        WSACleanup(); 
    
      return TRUE; 
    }  
    
    int main ()
    {
    
    	char IP_Adresse[4]; 
        cout << IP_auslesen(IP_Adresse) << endl;   
    
    	return 0;
    }
    

    Hier die meldung:
    error C2146: syntax error : missing ';' before identifier 'IP_auslesen'

    Da gehört doch keins hin ??

    Gruß
    andy_mann



  • 1. Dein Buffer (IP_Adresse) ist mit 4 etwas zu klein! -> IP_Adresse[16]
    2. IP_auslesen gibt nicht die IP-Adresse zurück (die steht nach dem Aufruf in IP_Adress), sondern einen BOOL

    Versuch's mal so:

    char IP_Adresse[16];
    if(IP_auslesen(IP_Adresse)) {
     cout << IP_Adresse << endl;
    }
    else {
     cout << "IP-Adresse konnte nicht ermittelt werden!" << endl;
    }
    

    Außerdem heißt dein Parameter in der Signatur IP_ADRESSE - für wsprintf verwendest du aber IP_ADDRESSE 😕



  • Ich danke Dir,

    das Problem ist bei mir nur, dass er beim test schon mekert.

    ip_abfrage.cpp(11) : error C2146: syntax error : missing ';' before identifier 'IP_auslesen'

    Ich finde den fehlenden ';' aber nirgends.

    Und noch was, ich möchte eigentlich nur die IP Adresse des localen Rechners herausfinden. Und nicht die des Routers oder so.

    Ich befinde mich in einem LAN.

    Gruß und Danke
    andy_mann



  • #include <windows.h>
    #include <winsock2.h>
    #include <stdio.h>
    
    BOOL IP_auslesen(char* IP_ADRESSE)
    {
       struct hostent* h;
       WSADATA wsaData;
       CHAR szHostName[MAX_PATH];
       int x;
    
       WSAStartup(MAKEWORD(1, 1), &wsaData);
       if(SOCKET_ERROR != gethostname(szHostName, MAX_COMPUTERNAME_LENGTH + 1))
       {
          if(NULL != (h = gethostbyname(szHostName)))
             for(x = 0; (h->h_addr_list[x]); x++)
                lstrcpy(IP_ADRESSE, inet_ntoa(*(in_addr*)h->h_addr_list[x]));
       }
    
       WSACleanup();
    
       return TRUE;
    }
    
    int main ()
    {
       char IP_Adresse[16];
       IP_auslesen(IP_Adresse);
       printf(IP_Adresse);
    
       return 0;
    }
    


  • Das dumme ist, dass das doch nur die Netzwerk-IP ist...



  • Du musst windows.h einbinden

    #include <windows.h>
    

    und Ws2_32.lib linken 😉



  • mmmhhhhh...

    danke Dir,

    jetzt bekomme ich noch mehr fehlermeldungen.
    Und zwar auch in den bibliotheken:

    #include <windows.h>
    #include <winsock2.h>
    #include <stdio.h>

    Ich habe Visual c++ 6.0 installiert.
    Fehlt mir da was ??

    Gruß
    andy_mann



  • flenders schrieb:

    Du musst windows.h einbinden

    Was meinst du, warum ich den Code u.a. gepostet habe...?



  • WebFritzi schrieb:

    Was meinst du, warum ich den Code u.a. gepostet habe...?

    Ich war eben zu langsam - und als ich zu schreiben begonnen hatte, stand dein Post noch nicht da 😉

    @andy_mann: Hast du Ws2_32.lib gelinkt?!



  • ohhhhh..

    das habe ich jetzt noch nie gemacht...

    bislang habe ich nur immer die standart bibliotheken nehmen müssen.

    #include <iostream> usw.

    kannste mir nen kleinen tipp geben ??

    Gruß und Danke
    andy_mann



  • Falls du VC++ 6 verwendest: Projekt > Einstellungen > Linker > Objekt-/Bibliothek-Module
    Da dann einfach hinten dranhängen 😉



  • mmhhh..

    habe Ws2_32.lib unter den Angaben die Du gennant hast eingefügt.
    Trotzdem selbe Fehlermeldung.

    Gruß
    andy_mann



  • welche? 🙄



  • hallo....

    winsock.h pringt fehlermeldung.

    mhhhh..
    nur zur Info,
    ich benütze als Projekt
    Win32 Console Application
    und als File
    C++ Source File

    Danke für Eure Gedult.

    Gruß
    andy_mann



  • Und wenn du winsock.h weglässt? und nochmal: was für Fehlermeldungen?



  • jjjjuuuuuuuhhhhuuuuu......

    vielen Dank....
    Jetzt hat es geklappt.

    Ihr seit echt die besten.

    Gruß
    andy_mann 🙂 🙂 🙂



  • Erstens: Man sollte immer seine Fehlermeldungen angeben!
    Zweitens: Man sagt an, wie die Lösung ausschaut, wenn man es geschafft hat.



  • Also 1.,

    die Ws2_32.lib hat gefehlt.
    "Falls du VC++ 6 verwendest: Projekt > Einstellungen > Linker > Objekt-/Bibliothek-Module "

    und hier der Source:

    #include <iostream>
    #include <winsock2.h> 
    #include <stdio.h> 
    using namespace std;
    
    BOOL IP_auslesen(char* IP_ADRESSE) 
    { 
    struct hostent* h; 
    WSADATA wsaData; 
    UCHAR ucAddress[4]; 
    CHAR szHostName[MAX_PATH]; 
    int x; 
    
    WSAStartup(MAKEWORD(1, 1), &wsaData); 
    if(SOCKET_ERROR != gethostname(szHostName, MAX_COMPUTERNAME_LENGTH + 1)) 
    { 
    if(NULL != (h = gethostbyname(szHostName))) 
    { 
    for(x = 0; (h->h_addr_list[x]); x++) 
    { 
    
    ucAddress[0] = h->h_addr_list[x][0]; 
    ucAddress[1] = h->h_addr_list[x][1]; 
    ucAddress[2] = h->h_addr_list[x][2]; 
    ucAddress[3] = h->h_addr_list[x][3]; 
    
    wsprintf(IP_ADRESSE, "%d.%d.%d.%d", ucAddress[0], ucAddress[1], ucAddress[2], ucAddress[3]); 
    } 
    } 
    } 
    WSACleanup(); 
    
    return TRUE; 
    } 
    
    int main () 
    { 
    
    char IP_Adresse[16]; 
    IP_auslesen(IP_Adresse); 
    printf(IP_Adresse); 
    
    getchar(); 
    return 0; 
    }
    

    Gruß
    andy_mann



  • 1.) Verwende doch bitte Code-Tags
    2.) Es funktioniert ohne windows.h 😕 - der dürfte dann doch BOOL eigentlich gar nicht kennen 🙄



  • flenders schrieb:

    Es funktioniert ohne windows.h 😕

    Bei mir ned!


Anmelden zum Antworten