C++ IP-Liste einlesen und anpingen

@RavenC: Hier geht es um C, ausserdem hilft rumprobieren auch nichts.
Und wie bekommst du denn Wert in ne Variable? So einfach wird das nicht werden

@Alfons2: Welche IP hast du denn versucht?
Wenn es 127.0.0.1 ist, ist verständlich, dass 0 rauskommt :)

edit: So, jetzt hab ich mein eigenes Programm endlich einmal kompiliert und ein paar Kleinigkeiten ausgebessert.
Die Farben für On/Offline sind zwar wieder nicht drinnen, aber jedenfalls kommen bei mir nicht 0ms (nur bei 127.0.0.1 :) )

Hier der Source nocheinmal komplett

C++:
#include<stdio.h>
#include<process.h>
#include<time.h>
#include<winsock2.h>
#include<windows.h>
#include<conio.h>

#pragma comment(lib,"ws2_32.lib")
#define ICMP_ECHOREPLY 0
#define ICMP_UNREACHABLE 3
#define ICMP_ECHO 8
#define ICMP_CODE_NETWORK_UNREACHABLE 0
#define ICMP_CODE_HOST_UNREACHABLE 1
#define ICMP_MIN_SIZE 8
#define STATUS_FAILED 0xFFFF
#define PING_FAILED 0xFFFFF0
#define PING_TIMEOUT 0xFFFFF1
#define PING_NOHOST 0xFFFFF2
typedef struct{unsigned int h_len:4;unsigned int version:4;unsigned char tos;
	unsigned short total_len;unsigned short ident;unsigned short frag_and_flags;
	unsigned char ttl;unsigned char proto;unsigned short checksum;unsigned int sourceIP;
	unsigned int destIP;}ip_header_t;
typedef struct{char i_type;char i_code;unsigned short i_cksum;unsigned short i_id;
	unsigned short i_seq;unsigned long timestamp;}icmp_header_t;
struct sock_char{SOCKET s;char c,no;char *b;};

unsigned short Ping_Checksum(unsigned short *buffer,int size){unsigned long cksum=0;while(size>1)
{cksum+=*buffer++;size-=sizeof(unsigned short);}if(size){cksum+=*(unsigned char*)buffer;}
cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return((unsigned short)(~cksum));}

unsigned int Ping_Ext(const char *ip,unsigned int datasize,int recvtimto){SOCKET sckSock;
SOCKADDR_IN saDest,saFrom;int nRecvTimeOut=recvtimto;datasize+=sizeof(icmp_header_t);
char *szICMPData=0;char szRecvBuff[65000+sizeof(ip_header_t)+sizeof(icmp_header_t)];DWORD dwStart,
dwStop;if((sckSock=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP))==INVALID_SOCKET)return PING_FAILED;
if(setsockopt(sckSock,SOL_SOCKET,SO_RCVTIMEO,(char *)&nRecvTimeOut,sizeof(nRecvTimeOut))==
SOCKET_ERROR)return PING_FAILED;{unsigned long ulAddr=inet_addr(ip);HOSTENT *pHostEntity=0;
if(ulAddr==INADDR_NONE){pHostEntity=gethostbyname(ip);memcpy(&ulAddr,pHostEntity->h_addr,
pHostEntity->h_length);}saDest.sin_addr.s_addr=ulAddr;saDest.sin_family=(pHostEntity?pHostEntity->
h_addrtype:AF_INET);saDest.sin_port=0;}{szICMPData=(char *)malloc(sizeof(icmp_header_t)+datasize+1);if(szICMPData==NULL)
return PING_FAILED;((icmp_header_t *)szICMPData)->i_cksum=0;((icmp_header_t *)szICMPData)->i_code=0;
((icmp_header_t *)szICMPData)->i_id=(unsigned short)GetCurrentProcessId();((icmp_header_t *)szICMPData)->
i_seq=0;((icmp_header_t *)szICMPData)->i_type=ICMP_ECHO;memset(szICMPData+sizeof(icmp_header_t),'.',datasize);
memcpy(szICMPData+sizeof(icmp_header_t),"sheel pings",min(datasize,11));}{((icmp_header_t *)szICMPData)->
timestamp=GetTickCount();((icmp_header_t *)szICMPData)->i_cksum=Ping_Checksum
((unsigned short *)szICMPData,datasize+sizeof(icmp_header_t));}if(sendto(sckSock,szICMPData,
sizeof(icmp_header_t)+datasize,0,(SOCKADDR *)&saDest,sizeof(saDest))==SOCKET_ERROR)return
PING_FAILED;dwStart=GetTickCount();while(1){int iResponseLen=0;{int nFromLen=sizeof(saFrom);
iResponseLen=recvfrom(sckSock,szRecvBuff,65000+sizeof(ip_header_t)+sizeof(icmp_header_t),0,
(SOCKADDR *)&saFrom,&nFromLen);dwStop=GetTickCount();if(iResponseLen==SOCKET_ERROR)
{if(WSAGetLastError()==WSAETIMEDOUT)return PING_TIMEOUT;else{return PING_FAILED;}}}
{ip_header_t *hdrIPHeader=(ip_header_t *)szRecvBuff;icmp_header_t *hdrICMPHeader
=(icmp_header_t *)(szRecvBuff+hdrIPHeader->h_len*4);if(hdrICMPHeader->i_id!=
(unsigned short)GetCurrentProcessId())continue;if(hdrICMPHeader->i_type==
ICMP_UNREACHABLE)if(hdrICMPHeader->i_code==ICMP_CODE_HOST_UNREACHABLE||
hdrICMPHeader->i_code==ICMP_CODE_NETWORK_UNREACHABLE)return PING_NOHOST;
if(hdrICMPHeader->i_code==ICMP_ECHOREPLY)break;}}free(szICMPData);
return dwStop-dwStart;}

int Ping(const char *ip,unsigned short int z=1000){int i=Ping_Ext(ip,32,z);
if(i==PING_FAILED||i==PING_TIMEOUT||i==PING_NOHOST)return -1;return i;}

char IsValidIP(char *ip,bool accwsp,char zuweis,bool tri){char p[32];
int e1,e2,e3,e4=1;int i,j;if(accwsp){j=0;for(i=0;i<=(signed)strlen(ip);i++)
{if(ip[i]!=32&&ip[i]!='	'&&ip[i]!=10&&ip[i]!=32){p[j]=ip[i];j++;}}}
else{strcpy(p,ip);}j=0;for(i=0;i<(signed)strlen(p);i++){if((p[i]<'0'||p[i]>'9')
&&p[i]!='.')return 0;if(p[i]=='.')j++;}if((j!=3&&(!tri))||(j!=2&&tri))return 0;
if(!tri)sscanf(p,"%d.%d.%d.%d",&e1,&e2,&e3,&e4);else{sscanf(p,"%d.%d.%d",&e1,&e2,&e3);}
if(e1<0||e2<0||e3<0||e4<0)return 0;if(e1>255||e2>255||e3>255||e4>255)return 0;if(zuweis)
{if(tri){if(zuweis<2)sprintf(ip,"%.3d.%.3d.%.3d",e1,e2,e3);else{sprintf(ip,"%d.%d.%d",
e1,e2,e3);}}else{if(zuweis<2)sprintf(ip,"%.3d.%.3d.%.3d.%.3d",e1,e2,e3,e4);
else{sprintf(ip,"%d.%d.%d.%d",e1,e2,e3,e4);}}}return 1;}

int main()
{
	HANDLE han=GetStdHandle(STD_OUTPUT_HANDLE);
	FILE *pFile;
	WSADATA wsastrct;
	char ip[64];
	int i;
	if(WSAStartup(MAKEWORD(2,2),&wsastrct))return 0;
	pFile=fopen("liste.txt","r");
	if(pFile==NULL)     
	{
		SetConsoleTextAttribute(han,0x0c);
		printf("Achtung! Die Datei 'liste.txt' konnte nicht geladen werden!\n");
		SetConsoleTextAttribute(han,0x07);
		system("pause");
		WSACleanup();
		return 0;
	}
	SetConsoleTextAttribute(han,0x0A);
	printf(" Die Datei 'liste.txt' konnte erfolgreich geladen werden!\n");
	SetConsoleTextAttribute(han,0x07);
	while(1)
	{
		if(feof(pFile))
		{
			fseek(pFile,0,SEEK_SET);
			for(i=0;i<60;i++)
			{
				Sleep(1000);
				if(kbhit())
				{
					if(_getch()==27)
					{
						fclose(pFile);
						WSACleanup();
						return 0;
					}
				}
			}
			system("cls");
		}
		ip[0]='\0';
		fgets(ip,64,pFile);
		ip[63]='\0';
		if(ip[strlen(ip)-1]=='\n')
			ip[strlen(ip)-1]='\0';
		if(ip[0]=='\0'){}
		else if(!IsValidIP(ip,1,0,0))
		{
			printf("Nicht g%cltig: ",129U);
			puts(ip);
		}
		else
		{
			int x=Ping(ip);
			printf(ip);printf(": ");
			if(x>=0)
				printf("Online: %d ms\n",x);
			else
				printf("Offline\n");
		}
		if(kbhit())
		{
			if(_getch()==27)
			{
				fclose(pFile);
				WSACleanup();
				return 0;
			}
		}
	}
	fclose(pFile);
	WSACleanup();
	return 0;
}
 
Zuletzt bearbeitet:
@RavenC: Hier geht es um C, ausserdem hilft rumprobieren auch nichts.
Und wie bekommst du denn Wert in ne Variable? So einfach wird das nicht werden
...

Sein Anfang ist aber ganz und gar nicht c sondern cpp ;)
Wie man die Werte in ne Variable bekommt muss ich morgen mal nach der Arbeit schauen..
Ist aber sicher auch möglich :D
 
Ok, funktioniert soweit schon, bei einigen Rechnern ist die Pingzeit immer noch 0ms, obwohl sie als Online angezeigt werden!
Bei unserem Router aber kommt eine Zahl von 16 zurück. Oder sind die anderen Rechner so schnell mit der Antwort, das der Wert nicht Messbar ist? :D

Und nein es ist auch nicht 127.0.0.1 Sondern Unser Server, der Router, und ein paar andere Rechner, die ab und an online sind, aber sonst offline.

EDIT:

Ich habs gefunden:

Der Wert ist tatsächlich unter dem Messbaren Bereich! Er ist unter 1ms, weil das Netzwerk nichts zu tun hat :D

Aber Danke erstmal!
 
Zuletzt bearbeitet:
@RavenC: Hast recht, ich bin nur nach dem: 346908-c-ip-liste-einlesen-und-anpingen-2.html
gegangen :)

@Alfons: Schön, das es funktioniert
Bitte noch ein kleiner Klick auf Erledigt :)
 
Bez. priv. Nachricht
Du kannst mit ein bisschen Bastelei Namen oder IP reinstopfen, dh machs einfach vor der IP-Prüfung
Wenns schon eine IP war, bleibts auch eine, und sonst wird der Name umgewandelt und dann die IP halt nocheinmal geprüft
Zeig einfach mal den Stand
 
C++:
int Ping( const char *ip, unsigned short int z = 1000 )
{
    int i=Ping_Ext(ip,32,z);

    if (i==PING_FAILED||i==PING_TIMEOUT||i==PING_NOHOST)return -1;
    
	return i;
}

int PingHost(char *ip, int argc, char **argv)
{
	
    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData;
    int iResult;

    DWORD dwError;
    int i = 0;

    struct hostent *remoteHost;
    char *host_name;
    struct in_addr addr;

    char **pAlias;

    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed: %d\n", iResult);
        return 1;
    }

    host_name = argv[1];

    printf("Calling gethostbyname with %s\n", host_name);
    remoteHost = gethostbyname(host_name);
    
    if (remoteHost == NULL) {
        dwError = WSAGetLastError();
        if (dwError != 0) {
            if (dwError == WSAHOST_NOT_FOUND) {
                printf("Host not found\n");
                return 1;
            } else if (dwError == WSANO_DATA) {
                printf("No data record found\n");
                return 1;
            } else {
                printf("Function failed with error: %ld\n", dwError);
                return 1;
            }
        }
    } else {
        printf("Function returned:\n");
        printf("\tOfficial name: %s\n", remoteHost->h_name);
        for (pAlias = remoteHost->h_aliases; *pAlias != 0; pAlias++) {
            printf("\tAlternate name #%d: %s\n", ++i, *pAlias);
        }
        printf("\tAddress type: ");
        switch (remoteHost->h_addrtype) {
        case AF_INET:
            printf("AF_INET\n");
            break;
        case AF_INET6:
            printf("AF_INET6\n");
            break;
        case AF_NETBIOS:
            printf("AF_NETBIOS\n");
            break;
        default:
            printf(" %d\n", remoteHost->h_addrtype);
            break;
        }
        printf("\tAddress length: %d\n", remoteHost->h_length);

        i = 0;
      if (remoteHost->h_addrtype == AF_INET)
       {
            while (remoteHost->h_addr_list[i] != 0) {
                addr.s_addr = *(u_long *) remoteHost->h_addr_list[i++];
                printf("\tIP Address #%d: %s\n", i, inet_ntoa(addr)); // Ausgabe der IP-AdressEN
            }														  // Sollen in einen Array, falls bei einem Host mehrere sind.
        } 
        else if (remoteHost->h_addrtype == AF_INET6)
        {   
            printf("IPv6 address was returned\n");
        }  
    }

    return 0;
}


 char IsValidIP( char *ip, bool accwsp, char zuweis, bool tri )
{
    char p[ 32 ];

    int e1, e2, e3, e4 = 1;int i, j;if ( accwsp )
    {

        j = 0;for ( i = 0;i <= ( signed ) strlen( ip );i++ )

        {if ( ip[ i ] != 32 && ip[ i ] != ' ' && ip[ i ] != 10 && ip[ i ] != 32 ) {p[ j ] = ip[ i ];j++;}}
    }
    else{strcpy_s( p, ip );}

    j = 0;for ( i = 0;i < ( signed ) strlen( p );i++ )
    {
        if ( ( p[ i ] < '0' || p[ i ] > '9' )
                && p[ i ] != '.' ) return 0;if ( p[ i ] == '.' ) j++;
    }

    if ( ( j != 3 && ( !tri ) ) || ( j != 2 && tri ) ) return 0;
    if ( !tri ) sscanf_s( p, "%d.%d.%d.%d", &e1, &e2, &e3, &e4 );else{sscanf_s( p, "%d.%d.%d", &e1, &e2, &e3 );}

    if ( e1 < 0 || e2 < 0 || e3 < 0 || e4 < 0 ) return 0;if ( e1 > 255 || e2 > 255 || e3 > 255 || e4 > 255 ) return 0;if ( zuweis )

    {
        if ( tri )
        {
            if ( zuweis < 2 ) cout << ip << "%.3d.%.3d.%.3d" << e1 << e2 << e3;
				//sprintf_s( ip, "%.3d.%.3d.%.3d", e1, e2, e3 );
			else

            {
                //sprintf_s( ip, "%d.%d.%d",e1, e2, e3 );
				cout << ip << "%d.%d.%d" << e1 << e2 << e3;
            }
        }
        else
        {
            if ( zuweis < 2 ) cout << ip << "%.3d.%.3d.%.3d.%.3d" << e1 << e2 << e3 << e4;
				//sprintf_s( ip, "%.3d.%.3d.%.3d.%.3d", e1, e2, e3, e4 );
							  
        else{
			cout << ip << "%d.%d.%d.%d" << e1 << e2 << e3 << e4;
			// sprintf_s( ip, "%d.%d.%d.%d", e1, e2, e3, e4 );
			}
        }
    }

    return 1;
}


int main()
{
    HANDLE han = ( GetStdHandle( STD_OUTPUT_HANDLE ) );
 
   ...
   ...
   ...


while ( 1 )  // Endlosschleife
    {

        if ( feof( pFile ) )  // Wenn im Ende des Files angekommen...
        {
            fseek( pFile, 0, SEEK_SET ); // ..springe zum Anfang der Datei

            for ( i = 0;i < 60;i++ )  // Inkrementiert von 0 auf 60
            {
                Sleep( 1000 ); // Warte eine Sekunde

			if ( _kbhit() )  // Taste gedrückt?
                {

                    if ( _getch() == 27 )  // Ist das eingegebene Zeichen == 27?
                    {
						SetConsoleTextAttribute( han, 0x0c );
						std::cout << "\n";
						std::cout << "\n";
						std::cout << "Programm wird geschlossen!\n";
						Sleep(3000);
						SetConsoleTextAttribute( han, 0x0F );
                        fclose( pFile ); // Schliesse Datei
                        WSACleanup(); 
                        return 0; // Gib 0 zurück
                    }

                }
                
            }
            //  system("cls");
            cout << "\n";
            cout << "\n";
            cout << "\n";
        }

        ip[ 0 ] = '\0'; // '\0' == Ende der Zeichenkette

        fgets( ip, 64, pFile ); // Lies 64 Zeichen vom Stream in ip

        ip[ 63 ] = '\0'; // Ende der Zeichenkette...

        if ( ip[ strlen( ip ) - 1 ] == '\n' )  // Selbsterklärend, strlen gibt die Länge der Zeichenkette aus
            ip[ strlen( ip ) - 1 ] = '\0';

    if ( ip[ 0 ] == '\0' ) {}
        else if ( !IsValidIP( ip, 1, 0, 0 ) )
        {
            printf( "Nicht g\x81 \bltig: ", 129U );
            puts( ip ); // Hängt '\0' an
        }
        else
        { 
            int x = Ping( ip );
            printf( ip );printf( ": " );       // Die IP wird ausgegeben




            if ( x >= 0 )           // Abfrage, für die Ausgabe des Status und Pingzeit
            {
                SetConsoleTextAttribute( han, 0x0A );
                cout << "Online: ";

                if ( x >= 5 )
                {
                    SetConsoleTextAttribute( han, 0x0C );
                    cout << x << "ms\n";
                }
                else
                {
                    if ( x >= 1 )
                    {
                        SetConsoleTextAttribute( han, 0x0E );
                        cout << x << "ms\n";
                    }

                    else
                    {
                        if ( x >= 0 )
                        {
                            SetConsoleTextAttribute( han, 0x0A );
                            cout << x << "ms\n";
                        }
                    }
                }

                SetConsoleTextAttribute( han, 0x0F );
            }
            else
            {
                SetConsoleTextAttribute( han, 0x0C );
                printf( "Offline\n" );
                SetConsoleTextAttribute( han, 0x0F );
            }
       }

        if ( _kbhit() )
        {
            if ( _getch() == 27 )
            {
 
		
				
       fclose( pFile );
			
             WSACleanup();
             return 0;
            }
        }

    }
    fclose( pFile );
    WSACleanup();
    return 0;
}

So, das ist der Code von main.cpp Dort oben ist nun die PingHost Klasse eingefügt. Sie soll die IPs in einem Array ausgeben, denn falls man einen Routing-Server mit mehreren IP-Adressen anpingt, sollen sie nach möglichkeit alle angegeben werden. Aber nun stehe ich auf dem Schlauch... wie kriege ich nun die IPs dazu sich in die Schlange zum anpingen einzuordnen?
 
Was hast du denn da gebaut :suspekt:
Alles was du machen musst, ist doch das Namensauflösen - das bei mir 4 Zeilen hat - und dann die alte Ping-Funktion aufrufen?
Was soll das Programm am Ende eigentlich können?
Aus einer Datei IPs durchgehen und anzeigen ob sie on/offline sind?
PS: Da fällt mir gerade auf, PingHost schaut verdächtig nach einem main aus MSDN auf :)
 
Zuletzt bearbeitet:
Also...
Das WSAStartup/WSACleanup ist bei dir im main noch drinnen?
Falls nicht: wieder rein damit

Eine neue Funktion, und ein überarbeitetes Ping:
Das ResolveHost ersetzt deine ganze riesige PingHost-Funktion :)
Und das Ping hat als einzige Änderung einen Aufruf von ResolveHost drinnen
dH du kannst dem Ping jetzt alles direkt übergeben: IPs, Rechnernamen, URLs...

C++:
int ResolveHost(char *str,char *z)
{
    SOCKADDR_IN a1;unsigned long a2;HOSTENT* a3;
    if(str==NULL)return 1;if(z==NULL)z=str;//Falls nichts übergeben wurde

    a2=inet_addr(str);if(a2!=INADDR_NONE)//Falls es schon eine IP ist
    {//dann nur z zuweisen und wieder fertig
        a1.sin_addr.s_addr=a2;
        strcpy(z,inet_ntoa(a1.sin_addr));return 0;
    }

    a3=gethostbyname(str);//Sonst auflösen
    if(a3==NULL)return 2;//Wenn Fehler beim Auflösen beenden

    //Sonst aus der zurückgegebenen Struktur
    //die IP herausholen und in einen String stopfen
    memcpy(&(a1.sin_addr),a3->h_addr_list[0],4);
    strcpy(z,inet_ntoa(a1.sin_addr));

    return 0;
}

int Ping( const char *ip, unsigned short int z = 1000 )
{
    char resolved[64];
    if(ResolveHost(ip,resolved))return -2;//Wenns nicht geklappt hat dann kein Ping
    int i=Ping_Ext(resolved,32,z);
    if (i==PING_FAILED||i==PING_TIMEOUT||i==PING_NOHOST)return -1;
    return i;
}

Das main lasst du am besten komplett so, als würdest du nur IPs einlesen
Einzige Änderungen:
Das
C++:
else if ( !IsValidIP( ip, 1, 0, 0 ) )
{
    printf( "Nicht g\x81 \bltig: ", 129U );
    puts( ip );
}
Kommt eben weg damit die Rechnernamen durchgelassen werden

Wenn was rein kommt, das keine IP und auch kein gültiger Rechnername ist,
würde es bei dir als Offline angezeigt
Kannst du ja bei Bedarf noch eine Fehlermeldung dazumachen
Wenn Der Returnwert >=0 dann sind es Millisekunden, wenn -1 dann Offline
und -2 Ist ein falscher Rechnername (siehe Ping)

Übrigens, ist mir nur aufgefallen: puts hängt kein \0 an, dafür aber ein \n (Zeilenwechsel)
Ist ein Riesenunterschied; \0 markiert nur das Ende des Strings

Gruß
 
okay stimmt, da ist Bullshit...

C++:
host_name = argv[1];
 
    printf("Calling gethostbyname with %s\n", host_name);
    remoteHost = gethostbyname(host_name);

Ist er das? Der das Auflöst mein ich? Er ruft ja die gethostbyname Methode auf und übergibt den Hostnamen, wobei remoteHost die IP-Adresse ist und danach erfolgt die Auswertung

Was soll das Programm am Ende eigentlich können?
Aus einer Datei IPs durchgehen und anzeigen ob sie on/offline sind?
Ja ist das nicht irgendwie der Sinn der Sache? :D
 
Zuletzt bearbeitet:
Zurück