WAN IP ermitteln trotz Router



  • Hi,
    ich hoffe ihr könnt mir mit dem Problem weiterhelfen habe was von RasEnumConnections gelesen allerdings scheint das nur zu funktionieren wenn der Rechner selbst eine dfü Verbindung aufbaut. Kennt der Rechner seine WAN IP überhaupt wenn er über einen Router kommuniziert? Falls nein ist es denke ich nur von extern möglich die IP zu ermitteln. Habe was davon gelesen http://www.whatismyip.com/ irgendwie zu parsen nur wie geht sowas ?

    Bin leider noch blutiger Anfänger

    TIA für jeden Ansatz





  • So bekommt man aber nicht die IP die der Router vom Provider bekommt. Der Rechgner selbst kennt diese aber auch nicht, wozu, er muss ja nur mit dem Router kommunizieren.

    <?
    print getenv("REMOTE_ADDR");
    ?>
    

    In eine PHP datei schreiben, hochladen, mit dem Programm runterladen und den Inhalt auswerten, dann hast du deine IP.



  • Also ich bekomme damit die IP, die mein Provider meinem Router zugewiesen hat. Deine Lösung ist doch das selbe wie das aus dem FAQ das ich gepostet habe, oder sehe ich da was falsch? Der Code aus dem FAQ holt sich auch nur das File von checkip.dyndns.org. Der einzige Unterschied zu deinem ist, dass man bei deiner Lösung noch extra selber eine Datei hochladen muss, und man dort einfach eine bereits vorhandene nimmt.



  • Danke für eure Antworten,

    ich denke die PHP Lösung ist gut bzw eine ähnliche Lsg, da ich keinen eigenen Server habe auf den ich die PHP Datei legen könnte habe ich mir überlegt mich auf www.whatismyip.com zu verbinden und im empfangenen Stream nach der IP zu suchen.

    Nur leider bin ich noch Anfänger in Sachen C...

    Habe mich in die Socksprogrammierung eingelesen ein gutes Tutorial zu dem Thema kann man auf http://www.madwizard.org/ (in englisch) finden.
    [ ein deutsches findet sich hier: http://www.c-worker.ch/ meiner Meinung nach allerdings nicht so gut]

    Ich hoffe das mein Code soweit stimmt aber ich komme leider nichtmal zum testen, denn sobald ich winsock2.h include kommt es zu Konflikten ( vorherige Deklaration ) ich vermute es liegt daran das in der windows.h lib die ich im selben Programm nutze einige Konstrukte von winsock definiert sind. ( ? ) Nur anscheinend leider nicht alle, lasse ich include winsock2.h weg sind SOCKET, SOCKADDR_IN und einige andere nicht deklariert.

    An diesem Problem beisse ich mir nun seit Stunden die Zähne aus bitte helft mir weiter.

    PS ich nutze den cygwin compiler da Teile des Programms für linux programmiert sind



  • c°h° schrieb:

    Ich hoffe das mein Code soweit stimmt aber ich komme leider nichtmal zum testen, denn sobald ich winsock2.h include kommt es zu Konflikten ( vorherige Deklaration ) ich vermute es liegt daran das in der windows.h lib die ich im selben Programm nutze einige Konstrukte von winsock definiert sind. ( ? ) Nur anscheinend leider nicht alle, lasse ich include winsock2.h weg sind SOCKET, SOCKADDR_IN und einige andere nicht deklariert.

    müsste eigentlich gehen evtl. musst du ein paar defindes setzten bevor du
    inkludierst. zeig doch mal deine includes



  • Ist leider Garnicht so einfach alle includes zu finden da das Programm das ich versuche zu modden recht komplex ist ( eigentlich zu komplex für einen Noob wie mich 😉 )
    Ich hoffe ich habe alle includes gefunden:

    folgendes steht in einer lib die dann in die main geladen wird:

    #ifndef _OS_HPUX
    #include <stdio.h>
    #endif

    #include <stdlib.h>
    #include <string.h>
    #include <signal.h>
    #include <netdb.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <time.h>
    #include <pwd.h>
    #include <regex.h>
    #include <sys/types.h>
    #include <sys/times.h>
    #include <sys/socket.h>
    #include <sys/time.h>
    #include <sys/wait.h>
    #include <errno.h>
    #include <dirent.h>
    #include <stdarg.h>
    #include <sys/utsname.h>
    #include <sys/resource.h>
    #include <sys/stat.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/ioctl.h>
    #include <grp.h>
    #include <assert.h>
    #include <termios.h>

    #ifdef HAS_CRYPT_H
    #include <crypt.h>
    #endif

    #ifdef HAS_SYS_SENDFILE_H
    #include <sys/sendfile.h>
    #endif

    #ifdef HAS_SYS_MMAN_H
    #include <sys/mman.h>
    #endif

    #ifdef HAS_SYS_VFS_H
    #include <sys/vfs.h>
    #endif

    #ifdef HAS_SYS_STATFS_H
    #include <sys/statfs.h>
    #endif

    #ifdef HAS_SYS_PARAM_H
    #include <sys/param.h>
    #endif

    #ifdef HAS_SYS_MOUNT_H
    #include <sys/mount.h>
    #endif

    #ifdef HAS_SYS_STATVFS_H
    #include <sys/statvfs.h>
    #endif

    #if defined(_OS_SunOS) \
    || defined(_OS_HPUX) \
    || defined(_OS_CYGWIN)
    #include <sys/termios.h>
    #endif

    #if defined(_OS_SunOS) \
    || defined(_OS_HPUX) \
    || defined(_OS_IRIX) \
    || defined(_OS_IRIX64)
    #include <strings.h>
    #endif

    in meinem Unterbereich include ich dann noch die
    #include "windows.h"
    (X)

    (X) hier habe ich auch versucht die winsocks2 zu includen



  • Jetzt seh ich grad was

    könnte es daran liegen :

    #include <sys/socket.h>

    ?



  • Das Problem liegt daran das TLI oder XTI zuvor im Code verwendendet wird. Das scheint die UNIX Socket Variante zu sein damit wär ich im Falschen Unterforum ( falls ich richtig liege bitte um Ver-ge/schie-bung )

    Naja jetzt such ich mir erstmal ein passendes Tutorial hoffentlich kann man damit ein html datei auslesen 😉

    Falls jmd einen passenden Codeschnipsel oder eine gute Seite dazu parrat hat wäre es natürlich super.

    TIA Copper Hobbit



  • #include <stdio.h>
    // usw 
    
    #if defined(_WIN32)
        // so ziemlich jeder compiler unter windows verwendet diese direktive
        #include <windows.h>
    #else
        #include <sys/socket.h>
        // und weiter unix spezifische includes
    #endif
    

    [edit]
    natürlich endif statt else



  • Dank Dir,

    ich hab jetzt endlich eine Funktion fertiggestellt die die IP ermittelt auch richtig da wenn ich sie in eine txt datei ausgebe sie richtig drinsteht. Nur wollte ich den char einer anderen Funktion übergeben, nur gebe ich den dort aus stürzt mein programm ab 😞

    Hier erstmal der Code :

    // ** GetMyIP **
    static char GetMyIP(){
    
        int sock;
        struct sockaddr_in host_addr;
        struct hostent *hostinfo;
        char *host;
        char command[1024];
        char buf[1024];
        char T_IPG[50];
        int bytes_sent, bytes_recv;
    	FILE * T_Out;
    
    	// Socket initialisierung
        sock = socket (AF_INET, SOCK_STREAM, 0);
        if (sock == -1) {
            return "socket()";
        }
    
       host = "63.209.100.216";  // www.whatismyip.com
    
        /* Adresse des Servers festlegen */
        memset( &host_addr, 0, sizeof (host_addr));
        host_addr.sin_family = AF_INET;
        host_addr.sin_port = htons (80);
    
        host_addr.sin_addr.s_addr = inet_addr ("63.209.100.216");
        if (host_addr.sin_addr.s_addr == INADDR_NONE) {
            // Server wurde nicht mit IP sondern mit dem Namen angegeben
            hostinfo = gethostbyname (host);
            if (hostinfo == NULL) {
                return "gethostbyname ()";
            }
            memcpy((char*) &host_addr.sin_addr.s_addr, hostinfo->h_addr, hostinfo->h_length);
        }
    
        /* Verbindung aufbauen */
        if (connect(sock, (struct sockaddr *) &host_addr, sizeof(struct sockaddr)) == -1) {
            return "connect()";
        }
    
        /* HTTP-GET-Befehl */
        sprintf (command, "GET / HTTP/1.0\nHost:www.whatismyip.com\n\n");
    
        /* Befehl senden */
        bytes_sent = send (sock, command, strlen (command), 0);
        if (bytes_sent == -1) {
            return "send()";
        }
    
        /* Antwort des Servers empfangen und in Datei ausgeben */
        T_Out = fopen("OUT.TXT","w");
        while ((bytes_recv = recv (sock, buf, sizeof(buf), 0)) > 0) {
            fputs(buf, T_Out);
        }
        if (bytes_recv == -1) {
            fclose(T_Out);
            return "recv()";
        }
        fclose(T_Out);
    
    	// Datei wird nach Schluesselwort "IP IS" durchsucht
        T_Out = fopen("OUT.TXT","r");
        if(T_Out != NULL){
    		char T_search[100];
    		int T_zaehl=0;
    		int T_hit;
    		T_hit = 0;
        	while(!feof(T_Out)){
    			if( fgets(T_search, 100, T_Out) != 0){
    				for(T_zaehl=0; T_zaehl<strlen(T_search); T_zaehl++){
    					switch (T_search[T_zaehl]){
    						case 73:
    							if(T_hit == 0){
    								T_hit++;
    							}
    							if(T_hit == 3){
    								T_hit++;
    							}
    							break;
    						case 80:
    							if(T_hit == 1){
    								T_hit++;
    							}
    							break;
    						case 32:
    							if(T_hit == 2){
    								T_hit++;
    							}
    							break;
    						case 115:
    							if(T_hit == 4){
    								T_hit++;
    							}
    							break;
    						default:
    							if(T_hit != 5){
    								T_hit = 0;
    							}
    					}
    					if(T_hit == 5){
    						T_zaehl = T_zaehl+2;
    						break;
    					}
    				}
    			}
    			if(T_hit == 5){
    				break;
    			}
    		}
    		if(T_hit == 5){
    			int T_zaehlIP;
    			T_zaehlIP = 0;
    			while(T_search[T_zaehl] != 32){				// IP String wird geschrieben
    				T_IPG[T_zaehlIP] = T_search[T_zaehl];
    				T_zaehlIP++;
    				T_zaehl++;
    			}
    			while(T_zaehlIP<15){
    				T_IPG[T_zaehlIP]=32;
    				T_zaehlIP++;
    			}
    			fclose(T_Out);
    			T_Out = fopen("crazy.txt","w"); //IP wird korrekt in cryzy.txt geschrieben
    			fputs(T_IPG, T_Out);
    			fclose(T_Out);
    			return T_IPG;
    		}
    		fclose(T_Out);
    		return "Konnte IP nicht ermitteln";
    	}
    }
    

    beim kompilieren erhalte ich zwei Warnings die evtl damit zutun haben könnten ich weiss aber nicht wie ich sie weg bekomme:
    - control reaches end of a non-void function
    - function returns address of local variable

    Ich weiss ist viel code zum durchschauen aber wie gesagt das ermitteln der ip funzt denke hat nur was mit der übergabe in die andere funktion zutun.
    Diese ist eine void:

    static void u_PCinfo(){
       char MyIP;
       ...
       MyIP = GetMyIP();
       printf(MyIP);
    }
    

    TIA



  • Hab das Problem nun mit einem globalen char gelöst ist zwar nicht so schön aber es klappt und das ist die hauptsache

    danke an alle die mir geholfen haben echt ein gutes board hier


Log in to reply