# C++ IP-Liste einlesen und anpingen



## Alfons2 (9. September 2009)

Huhu, mein vorhaben, ist wie sich die Leute schon denken können die den Titel gelesen haben, ist eine IP-Liste in z.B. liste.txt einzulesen und sie nach und nach nur checken, ob der Rechner mit der IP online ist oder nicht. Das geht am  besten mit einem Ping und das Ergebniss soll er wie unten ausgeben. Diese Datei sollte dann immer weiter laufen und praktisch alle 10min den Vorgang wiederholen. Und das ganze in C++.


```
192.168.1.1 - online
192.168.1.6 - online
192.168.1.8 - offline
192.168.1.22 - offline
192.168.1.34 - online
```
wichtig sind auch die Farben!

Also ich fang mal an:


```
#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;


int main(int argc, char *argv[])
{
    
ifstream    filename;    
    filename = liste.txt;

    
do {
file_stream.open("liste.txt", ios_base::out | ios_base::in);
  
  
  
 } while()

file_stream.close();

    system("PAUSE");
    return EXIT_SUCCESS;
}
```


----------



## Anfänger92 (9. September 2009)

Hi,

wenn cih deinen Code so seh ersma die Frage:
Hast du Erfahrung mit C++ bzw. haste damit schonmal Programiert?
Ich sag nur:


> filename = liste.txt;



Also das einlesen der IP Adressen sollte ja kein Problem sein nehme ich an.
Falls doch versuchs mal hiermit:
FILE, fopen, fclose, fscanf <--- sollte in "stdio.h" zu finden sein.

Das anpingen schon eher denke ich.
Ich weiß nich obs mit Sockets geht, vll mal googlen:
SOCKET, WinSock2.
Ansonsten mal nen Beispiel zu "Ping" in der Console angucken.

Farben:
mit

```
system("color xx");
```
kanst du die Farbe der Console ändern.
Wobei X für verschiedene Farbwerte steht.
Die erste Zahl ist die Vordergrundfarbe(Schriftfarbe),
die zweite die Hintergrundfarbe.

Vll jetzt erstmal googlen und dann nochmal melden.

MFG
Anfänger


----------



## Alfons2 (9. September 2009)

> system("color xx");


Ist aber nur für die gesammte Konsole und nicht für einzelne Zeichen/Wörter.

Ich bin kein Meister in C++ aber nen bisschen kenn ich mich schon aus 
Nur im Einlesen eines Files macht es Probleme bzw. eher beim auswerten.

Ich muss doch, die z.B. 50 IPs (können es locker werden) alle in einen array umwandeln, die er dann alle nach der Reihe abfragt. Dann das online/offline ergebniss in einen weiteren array eintragen und ausgeben.

Aber wichtig ist, das es eine Liste ist, die ich nachträglich ändern kann und wenn möglich nicht auf 50 begrenzt ist.


----------



## Anfänger92 (9. September 2009)

Such mal nach std::vector.

MFG
Anfänger


----------



## Alfons2 (9. September 2009)

Ein std::vector ist ein dynamisches Feld!

Das würde das Problem der begrenzten Anzahl lösen.

Naja ich mache morgen weiter bin Müde 

gn8


----------



## sheel (9. September 2009)

Hier mal eine Pingfunktion (nicht selber geschrieben und vielleicht nicht der schönste Code  , aber ich hab bis jetzt keinen Fehler feststellen können, läuft seit einem Jahr)

```
#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

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),"xyxyz 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;}
```

Das Original ist eigentlich Ping_Ext, aber der seltsamen Klotz ist ziemlich unpraktisch zum aufrufen.
Du übergibst der Funktion Ping einfach die IP, wenn -1 zurückkommt wars Offline, sonst sinds die Millisekunden, wielang die Antwort gebraucht hat.
Du kannst der Funktion nach der IP auch noch die Millisekunden übergeben, die sie max. warten soll.

Hoffe, dir hilft das
Sheel

edit:Wegen der Farben: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xAB);
Statt dem AB nimmst du halt die Werte für Hintergrund und Schrift, aufgelistet in der cmd: "color /?"


----------



## Alfons2 (10. September 2009)

Vielen Dank! Wird mir bestimmt sehr helfen, allderdings nun keine Zeit zum programmieren 

Aber wenn das eine eigene Funktion ist, dann kann ich sie ja in eine Headerdatei reinschreiben, mit dem Namen Ping_Ext und diese dann mit #include "Ping_Ext"
aufrufen.

Beim aufrufen dieser Funktion, die IP, gegebenfalls die Millisekunden dazu und das Script machen lassen. Den Rückgabewert auswerten, 

```
If (Ping_Ext == -1) {
{ cout << ip <<"offline\n";
}
else
{
cout << ip <<"online\n";
}
```

Als was muss ich eine IP setzen? int, float, ... geht ja nicht weil das dann ja mehr als eine Nachkommastelle wären.

EDIT:

Was muss ich alles includieren?

Ich habe:

```
#include <iostream>
#include <cstdio>
#include <winsock2.h>
```
diese includiert, aber anscheinend brauch ich nochwas


----------



## sheel (10. September 2009)

Also bei der Includedatei solltest du vielleicht ein .h beim Dateinamen noch anhängen

Inkludieren müsstest du glaub ich noch windows.h

und statt
If (Ping_Ext == -1) 
wäre doch

char ip[64];
...
If (Ping(ip) == -1) 

Irgendwie sinnvoller

Wie gesagt, Ping_Ext liefert irgendwelche seltsamen Zahlen zurück, verwende lieber Ping

Zeig vielleicht mal deinen aktuellen Stand


----------



## Alfons2 (10. September 2009)

Hab dir hier mal das Projekt schnelll hochgeladen, aber muss jetzt dringend los, bin noch nicht sehr sweit gekommen 


In Verbindung mit windows.h macht er probleme beim compilen, da muss glaub ich nohc eine dll datei reingebunden werden

Anhang anzeigen Pinger.zip


machs gut bis nachher alfi


----------



## Alfons2 (10. September 2009)

So, ist doch ein bisschen später geworden, aber habe nun schonmal etwas weiter gebastelt, ich hab es nun nochmal mit Visual C++ Express gemacht...

Ich muss noch die IP-Liste interpretieren lassen, geöffnet wird sie schonmal erfolgreich, und die Ips, der Funktion Ping_Ext, die ich in eine header Datei mit Namen Ping_Ext.h gelegt habe, übergeben. Den Rückgabewert wieder einsammeln und mit

```
char ip[64];
...
If (Ping(ip) == -1)
```
auswerten und anzeigen lassen.


Das mit den Farben klappt nun hundert Prozentig so wie ich es haben will 


```
#include <windows.h>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <fstream>


// SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x0A);	<-- Schwarz:Grün
// SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x0c);	<-- Schwarz;Rot		
// SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x07);	<-- Schwarz;Grau Normale Konsole 
// cout << "Hallo Grüne Welt\n";

using namespace std;

int main()
{


  FILE * pFile;
  pFile = fopen ("liste.txt", "w");   // Die IP-Liste wird geöffntet und Schreibrechte gesetzt
  if (pFile==NULL)                   // Test ob das File existiert      
  {
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x0c);
	cout << "Achtung! Die Datei 'liste.txt' konnte nicht geladen werden!\n";
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x07);
    fputs ("fopen example",pFile);
    fclose (pFile);
  }
  else{
	  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x0A);
	  cout << " Die Datei 'liste.txt' konnte erfolgreich geladen werden!\n";
	  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x07);
	  }
do{




Sleep(600000); //10min warten
}while(quiter == 0); 




system("pause");
return 0;      
}
```


----------



## sheel (10. September 2009)

Hi,

du hast include<winsock2.h> vergessen

Ausserdem: Beim fopen mit "w" radierst du den gesamten Dateiinhanlt weg!
Wozu willst du Schreibrechte? Ich dachte, er soll die IPs auslesen?

Dann...wo ist denn die ping_ext.h inkludiert?

Nächstes  : Beim "if(pFile==NULL)..." nach deinem Schreib-öffnen
hast du ja ein fputs und ein fclose drin!
Die führen sicher zu einem Absturz. Raus damit.
Man kann nichts in eine nicht offene Datei schreiben, und auch diese Datei wieder schließen geht einfach nicht.

Das do-while-quieter... sollte besser in das else darüber rein, nur system("pause"); und return 0; draussenlassen

...Ich schreib dirs einmal um, hab sonst nicht viel zum tun


----------



## sheel (10. September 2009)

Hier bitte sehr:
Die Funktion IsValidIP kannst du entweder in den Ping_Ext-Header packen oder so herausen lassen, egal
Übrigens sorry für die grauenhafte Formatierung von der Funktion 

Habs nicht getestet, Farben für On/Offline sind auch noch nicht drinnen

```
#include<stdio.h>
#include<conio.h>
#include<winsock2.h>
#include<windows.h>
#include"Ping_Ext.h"

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()
{
	HANLDE han=(GetStdHandle(STD_OUTPUT_HANDLE);
	FILE *pFile;
	WSADATA wsastrct;
	char ip[64],key;
	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");
		}
		fgets(ip,64,pFile);
		ip[63]='\0';
		if(ip[strlen(ip)-1]=='\n')
			ip[strlen(ip)-1]='\0';
		if(!IsValidIP(ip,1,1,0))
		{
			printf("Nicht gültig: ");
			puts(ip);
		}
		else
		{
			printf(ip);printf(": ");
			if(Ping(ip)>=0)
				printf("Online\n");
			else
				printf("Offline\n");
		}
		if(kbhit())
		{
			if(_getch()==27)
			{
				fclose(pFile);
				WSACleanup();
				return 0;
			}
		}
	}
	fclose(pFile);
	WSACleanup();
	return 0;
}
```


----------



## Alfons2 (11. September 2009)

Gut Danke, bist der beste 

Das do-while-quiter, habe ich deshalb reingemacht, weil sich die prozedur alle 10min wiederholen soll. Natürlich könnte ich auch ein anderes Programm suchen, was dieses Programm hier alle 10min öffnet aber so erschien es mir einfacher 

In das Chaos bring ich schon ein wenig Ordnung und die Farben mach ich auch rein,





EDIT: Obwohl, ein Problem gibt es noch. Das main script funktioniert Prima 
Aber bei der Ping_Ext.h gibts noch Probleme udn zwar mit undeklarierten Bezeichnern

Habe alle Headerdateien includiert, die du gesagt hast, das ich sie brauche.

Wie z.B.



			
				Fehlerkonsole von VC++ 2008 hat gesagt.:
			
		

> hdrICMPHeader
> icmp_header_t
> hdrIPHeader



Ich habe die ws2_32.lib schon eingebunden verschiedene Header eingebunden, hilft aber nicht sonderlich viel
Alfons


----------



## sheel (11. September 2009)

Das mit den 10 min hab ich schon reinprogrammiert 

Wegen der Header probier mal
#include<iphlpapi.h>

sonst weis ich auch nicht weiter


----------



## Alfons2 (11. September 2009)

Hm... trotz des Headers 



> error C2065: 'icmp_header_t': nichtdeklarierter Bezeichner


----------



## sheel (11. September 2009)

Sch... meine Schuld
Das fehlt noch am anfang deiner Ping_Ext-Headerdatei:


```
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;
```

Was ich noch vergessen habe zu erwähnen: Die Esc-Taste beendet das Programm


----------



## Alfons2 (12. September 2009)

Joar nun funktioniert es! 

Das heißt ich kann es kompilieren. 

NUn werde ich es noch ein bisschen ausfeilen, das heißt Farbe rein bringen und ein bisschen benutzerfreundlicher gestalten 


RIESEN Dankeschön an dich

Alfons


----------



## sheel (14. September 2009)

Bez. deiner priv. Nachricht:
Wie schon erwähnt, gibt die Funktion Ping entweder die Zeit in Millisekunden oder -1 für Fehler(nicht erreicht etc) zurück
Du musst also überhaupt nichts am Header ändern, nur den Returnwert der Funktion Ping ausgeben

Ändere dazu das hier

```
else
{
    printf(ip);
    printf(": ");
    if(Ping(ip)>=0)
        printf("Online\n");
    else
        printf("Offline\n");
}
```
in das:

```
else
{
    printf(ip);
    printf(": ");
    int x=Ping(ip);
    if(x>=0)
        printf("Online, hat %d Millisekunden gebraucht\n",x);
    else
        printf("Offline\n");
}
```

Das wärs, mehr musst du nicht ändern

Gruß


----------



## Alfons2 (14. September 2009)

Hmm, funtzt net so wirklich, der Wert ist Null...

Habe es so ähnlich versucht, habe mit 

```
cout  << "Online" << Ping(ip) << endl;
```
versucht, aber da war der Wert auch Null


----------



## RaVenC (14. September 2009)

Einfach:

```
system(("ping " + ip).c_str());
```
bzw wenn dass nicht geht:

```
system(("ping " + ip)->c_str());
```

oder wenn es dir nicht reicht, dann etwas schwerer:
http://www.developerfusion.com/article/4628/how-to-ping/


----------



## sheel (14. September 2009)

@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


```
#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;
}
```


----------



## RaVenC (15. September 2009)

sheel hat gesagt.:


> @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


----------



## Alfons2 (15. September 2009)

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? 

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 

Aber Danke erstmal!


----------



## sheel (15. September 2009)

@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


----------



## sheel (11. Februar 2010)

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


----------



## Alfons2 (11. Februar 2010)

```
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?


----------



## sheel (11. Februar 2010)

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


----------



## sheel (11. Februar 2010)

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...


```
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

```
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ß


----------



## Alfons2 (11. Februar 2010)

okay stimmt, da ist Bullshit...


```
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?


----------



## sheel (11. Februar 2010)

Ja, das ist der Aufruf, aber du bekommst eben nicht direkt die IP zurück
siehe vorigen Post


----------



## Alfons2 (11. Februar 2010)

Sieht gut aus und kapiert habe ich es nun auch!

Jedoch sagt er mir beim kompilieren:



> Kompilieren...
> main.cpp
> .\main.cpp(160) : error C3861: "ResolveHost": Bezeichner wurde nicht gefunden.



Habe schon gegoogelt, aber nichts gefunden was ich hätte verwerten können, oder was etwas gebracht hätte...


----------



## sheel (11. Februar 2010)

Hast du denn die Funktion nicht im Quelltext?
Falsch inkludiert?
Falsche Datei bearbeitet?


----------



## Alfons2 (11. Februar 2010)

ne alles so wie du es gesagt hast, eigentlich auch alles includiert und es ist auch die richtige datei gewesen

EDIT:

aah mist, sry hatte ausversehen beim einfügen der änderungen einen kleinen abschnitt überschrieben, sodass er es nicht mehr korrekt lesen konnte.
Aber nun geht er!


Sau geil von dir!


----------



## Matthias Reitinger (14. Februar 2010)

sheel hat gesagt.:


> Und das Ping hat als einzige Änderung einen Aufruf von ResolveHost drinnen
> dH du kannst dem Ping jetzt alles direkt übergeben: IPs, Rechnernamen, URLs...


URLs wohl eher nicht, da gethostbyname nur IP-Adressen oder Hostnamen entgegennimmt. Abgesehen davon ist die Funktion obsolet, es sollte stattdessen getaddrinfo verwendet werden.

Grüße,
Matthias


----------



## sheel (14. Februar 2010)

getaddrinfo hab ich schon weiter vorne erwähnt
Und ich weis nicht, ob es URLs generell auflösen kann, aber http://www.google.com hat funktioniert 

PS: Sorry, doch nicht erwähnt.
Angefangen hat die Unterhaltung über priv. Nachrichten, da stehts drin

PPS: Wieder was gelernt


----------



## Matthias Reitinger (14. Februar 2010)

sheel hat gesagt.:


> Und ich weis nicht, ob es URLs generell auflösen kann, aber http://www.google.com hat funktioniert


Das ist auch keine URL, sondern ein Hostname.

Grüße,
Matthias


----------



## sheel (2. April 2010)

Bez. priv. Nachricht:

Wegen deinem Codestück:
ip ist erstens einmal EIN String, kein Stringarray.
mit ip[0] etc greife ich auf die Einzelnen Zeichen zu.

In der ersten Anweisung radiere ich den aktuellen Inhalt von ip raus-es bleibt ein leerer String, der bis zu 64 Zeichen aufnehmen kann.

Anw2:Aus der Datei wird eine Zeile eingelesen (die IPs stehn ja zeilenweise drinnen) und in ip gespeichert. Falls die aktuelle Zeile länger als 64 Zeichen ist (sollte für eine IP eigentlich reichen, und ip kann eben max. soviel aufnehmen), wird der Rest einfach abgeschnitten.
Über 64 Zeichen ist es sowieso keine gültige IP, da ist der Rest auch schon egal.

Anw3:
eim einlesen macht die genannte Funktion selber ein '\0' zum Schluss, um das Stringende zu markieren.
Falls wirklich 64 Zeichen erreicht wurdenund etwas abgeschnitten wurde, war ich mir nicht sicher, ob fgets das mit der '\0' wohl ordentlich macht, also habs ichs halt selber nocheinmal im Code: Das letzte verfügbare Zeichen von ip wird auf '\0' gesetzt.
Falls das gleiche '\0' nicht schon vorher vorkommt, "merken" die anderen Sachen, die den String danach brauchen, spätestens hier, dass Schluss ist.

Anweisung4: Fällt mir gerade auf dass das nicht so toll ist, sicherer ists so...

```
if (ip[0]!='\0'&&ip[ strlen( ip ) - 1 ] == '\n' )
            ip[ strlen( ip ) - 1 ] = '\0';
```
fgets hängt nämlich, wenn es die Zeile fertig eingelesen hat, auch noch gern '\n' ins ip rein, dass in einer Datei quasi ein Zeilenwechsel ist. Eingelesen bei der IP kann man das aber nicht mehr brauchen

dh wenn überhaupt was in ip drin ist und das letzte Zeichen ein Zeilenwechsel ist, kommt der weg, indem der String einfach um eins gekürzt wird.


Und wegen deiner anderen Frage: Poste den betreffenden Code bitte einmal, ich hab keine Ahnung um welche Stelle es da geht.


----------



## Alfons2 (2. April 2010)

Ahh, ich glaube nun habe ich es geschnallt,
aber open bei der Deklaration von ip steht char ip[ 64 ]; Also ist es doch ein char und kein String oder?

Ich fasse nochmal zusammen:
Also er liest eine Zeile ein, packt davon 64 Zeichen in ip, bastelt da noch etwas dran rum  wenn es zu lang ist schneidet er es usw. makiert die Stelle wo es aufhört
Dann übergibt er ip an die Ping() Funktion, die wiederum an andere sodass darin enthaltene ip aufgelöst wird und ein Wert zurück kommt, der dann ausgewertet wird.
Und da das ganze ja in einer Endlosschleife steht, fängt die Geschichte wieder von vorne an, nur das er diesmal eine IP weitergeht in der Liste.

Danke dir nochmal


----------



## sheel (2. April 2010)

Also, in einer Endlosschleife sollte es nicht stehen, am Ende der Datei sollte es doch aufhören

Bezüglich ip: Ein char ist ein einzelnes Zeichen.
Kann Ein Buchstabe sein, eine Ziffer oder sonst irgendwas aus der ASCII-Tabelle.
ip ist genaugenommen ein char-Array, das bis zu 64 chars speichern kann.
Und ein Haufen Buchstaben etc ist halt nichts anderes wie ein String...
Die 64-Grenze hab ich mir damals halt so ausgesucht, es gibt nämlich keine längere IP und die Zahl ist mir halt als erstes eingefallen 

Die '\0' am Stringende haben die Erfinder von C (oder sonst irgendwer damals, keine Ahnung) sich damals eben ausgesucht, um das Stringende zu markieren, weil ein Array mit max. 64 Buchstaben ja auch kürzere Sachen drinnen haben kann
Es müssen ja nicht immer genau 64 Buchstaben sein.


----------



## Alfons2 (2. April 2010)

ja, ich meinte natürlich ein char array

Das mit der Endlosschleife habe ich nicht deutlich genug beschrieben, er wiederholt den Vorgang, aber oben an der Schleife, steht ja eine Abfrage, wenn am Ende der Datei... dann springe zum Anfang und zähl bis 60 hoch anschließend macht er weiter pingt, pingt pingt usw. Solange eben bis man das Programm schließt


----------



## Tommy55 (15. Juni 2010)

Hallo,

ich kann wahrscheinlich zu dem Thema wenig beitragen, aber ich suche genau so ein Programm. Ich möchte eine IP-Liste einlesen und nachher ein Protokoll haben was davon geantwortet hat und was nicht. Kann jemand mir total programmier Unbegabten ein ausführbares komplettes Programm zur Verfügung stellen? 

Herzlichen dank schonmal im Vorraus.

Gruß

Thomas


----------



## sheel (15. Juni 2010)

Hier bitte sehr 

In die Datei Liste tragst du die einzelnen IPs ein, je eine pro Zeile
Zurzeit steht eine IP von Google drin, die erreichbar sein müsste, und eine erfundene, die offline ist.
Nur zum Testen.

zum Programm gibts eigentlich nicht viel zu sagen
Wenn du das Programm dauerhaft laufen lässt, werden alle IPs einmal pro Minute neu getestet
Mit Escape kann man das Ganze beenden.

Getestet unter Windows XP, SP2

Gruß


----------



## Tommy55 (29. Juni 2010)

Spitze vielen Dank!

Sorry das ich so spät antworte. Bin zur Zeit ein wenig arg beschäftigt.

Gruß

Thomas


----------



## Tommy55 (29. Juni 2010)

Hallo,

ich glaube ich brauche nochmal Hilfe. in dem Zip ist eine datei die ich nicht öffnen kann. Kannst du mir sagen mit welchem Programm ich die öffnen kann. Am liebsten währe mir eine exe oder bat datei die ich nur ausführen muß.

Danke.

Gruß

Thomas


----------



## sheel (29. Juni 2010)

Kein Problem 
Der gesamte Quelltext ist für den ursprünglichen Fragesteller sowieso von mir schon auf der vorigen Seite gepostet gewesen...ich hab ihn nur noch einmal kompiliert 

Wenns Fragen gibt, meld dich halt nocheinmal

Gruß

edit: Hab den zweiten Beitrag erst jetzt gesehen...nächste Seite


----------



## sheel (29. Juni 2010)

Moment, da ist wohl was schiefgegangen
Ich werds gleich nocheinmal raufladen

edit: Hier
Reine Exes lassen sich im Forum nicht raufladen


----------



## Tommy56 (29. Juni 2010)

Hm in der zip Datei ist wieder was was ich nicht ausführen kann. Ich glaube du mußt das für Dumme erklären ;-)

ich hab VS 2010 installiert. Mir würde schon eine vbs Datei reichen. 

Danke

Gruß

Thomas


----------



## sheel (29. Juni 2010)

"In" der Zip-Datei?
Ich dachte zuerst, du kannst die Zipdatei nicht öffnen

Was kannst du daran nicht starten?

Das eine ist die txt-Datei mit den IPs, kannst du mit jedem Textbearbeitungsprogramm aufmachen, am einfachsten gleich den Notepad.

Das zweite ist die Exe selber.
Du arbeitest doch unter Windows, oder?
Was passiert, wenn du die starten willst?
Irgendeine Fehlermeldung?

PS: Warum eigentlich "VBS-Datei"?
Das ist doch ein c-Programm :suspekt:


----------



## Tommy56 (29. Juni 2010)

Jetzt bin ich total irritiert.

Ich hab eine zip Datei. Wenn ich die mit winrar auspacke dann packt er genau eine Datei aus. Die wird weder als TXT noch als was anderes bekanntes identifiziert. 

jetzt muß du mir sagen was ich machen soll. irgendwie bin ich wirklich zu blöde. Windowsbenutzer klicken muß funktionieren 

Gruß

Thomas


----------



## sheel (29. Juni 2010)

Hast du irgendeinen Vorschlag, wie ichs schicken soll, da das ZIP ja anscheinend nicht geht?


----------



## Tommy56 (29. Juni 2010)

gute Frage:

wenn die dateien nochmal in ein ZIP mit Passwort packst. vielleicht funtzt es dann.

Password: test

danke! weiß auch nicht was das ist komisch

Gruß

Thomas


----------



## sheel (29. Juni 2010)

Habs jetzt ungepackt auf Rapidshare
http://rapidshare.com/files/403803736/Programm.exe.html
http://rapidshare.com/files/403803742/liste.txt.html
Beide Dateien in den gleichen Ordner

Gruß


----------



## Tommy56 (29. Juni 2010)

Ich habs sie juhuuuuu

danke

Schwere Geburt das Ding


----------



## Tommy56 (29. Juni 2010)

So läuft. Sag mal kann man da noch einarbeiten das er eine Logdatei schreibt wo nachher drin steht wer und wer nicht erreicht wurde?

Gruß

Thomas


----------



## sheel (29. Juni 2010)

Würde mit einer kleinen Batchdatei am einfachsten gehen.
Aber das Programm rennt ja solange, bis esc gedrückt wurde, das muss raus.
Hier ein Link zur neuen Programmversion:
http://rapidshare.com/files/403817880/Programm2.exe.html

Die Batchdatei ist dann einfach:

```
Programm >Logdatei.txt
```

Falls die IP-Liste nicht liste.txt heißt, sondern zB xy.txt:

```
Programm xy.txt >Logdatei.txt
```


----------



## Tommy56 (29. Juni 2010)

super 

wie kann ich den das wieder gut machen? 

Gruß

Thomas


----------



## sheel (29. Juni 2010)

Solang es funktioniert, bin ich schon zufrieden 
Und viel zu tun war nicht; wie gesagt, das meiste vom Quelltext hab ich schon beim ersten Fragesteller gemacht

Gruß


----------



## Tommy56 (29. Juni 2010)

ja trotzdem danke von einem Planlosen

Gruß

Thomas


----------



## tobsa (25. Oktober 2010)

Hi,

ich bekomme leider immer nur Offline angezeigt. Bild: http://gbimg.org/p.php?q=heopq

Hatte jmd schon das Problem, oder weiß jmd ne lösung?
Edit: Ist Win XP mit SP3

Möchte mit dem Programm gerne 4 Rechner bei uns im Netzwerk anpingen vom WG-Server aus.
Dieser soll sich dann, wenn keiner der Rechner antwortet abschalten.
Geht das überhaupt damit/Kennt jmd ne alternative?

Edit: das Herunterfahren hab ich von hier: (zumindest Grob)
http://www.online-tutorials.net/sonstiges/windows-herunterfahren/sourcecodes-t-24-47.html

mfg Tobsa

Edit: mir fällt gerade ein, das der Server ohne Adminrechte läuft, kann das ein Grund sein? (Kanns grad leider nicht testen, der is am daten schaufeln...)


----------



## sheel (25. Oktober 2010)

Hast du mein Programm beim Link heruntergeladen (bei welchem , erster oder zweiter Link) oder den Quelltext von hier kompiliert?
Was steht in deiner liste.txt?


----------



## tobsa (25. Oktober 2010)

Hab das von Rapidshare + den Quelltext.
Beide gehn leider nicht.

In der liste stehn die IP Adressen die auf dem Screenshot zu sehn sind, also:
"
192.168.0.194
192.168.0.195
192.168.0.196
192.168.0.197
192.168.0.198
127.0.0.1
74.125.43.105
"

Edit: So, hab mal in den Adminmodus gewechselt, und siehe da, es geht -.-

sry für die aufregung...


----------



## sheel (25. Oktober 2010)

Interessant...sollte eigentlich auch ohne Admin gehen.
Ob das am SP3 liegt?
Werd ich testen.


----------



## tobsa (25. Oktober 2010)

hmm, liegt wirklich an den adminrechten.

bissl OT:
weiß jmd wie ich im Benutzer soetwas dauerhaft als Admin ausführen kann?
ich kann ja rechte Maustaste - Ausführen als Admin..

dann gehts auch.. Brauch es aber das es mir das Programm quasi mit dem autostart hochfährt und dann solange läuft bis es den PC ausschaltet.

mfg

Edit:
mit
%systemroot%\system32\runas.exe /savecred /user:Administrator "D:\Autoshutdown\IP.exe

das in der Verknüpfung vor den Pfad. (Administrator ist der Benutzername als der es ausgeführt werden soll)
die liste.txt muss dann allerding in "C:\WinXP\system32" kopiert werden
mfg


----------



## tobsa (25. Oktober 2010)

So, nun muss ich doch noch Fragen: Wo ist den der Timer eingebaut, damit er sich jede Minute aktualisiert? Muss den ja auf ca. 5 Min hochsetzen.

mfg


----------



## sheel (25. Oktober 2010)

Zeigst du vielleicht einmal den Quelltext, den du verwendest? Ich verlier den Überblick vor lauter verschiedenen


----------



## tobsa (25. Oktober 2010)

das was mit kommentaren versehn ist ist von mir. die header datein hab ich wo anderst hingeschmissen..

hau mich aber bitte nicht weil ich dein programm verunstaltet hab. kann (noch) kein C++ und C nur so halb.


```
#include "stdafx.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;}
int A=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(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);

            for(i=0;i<60;i++)					// Beginn Startverzögerung, ca. 5 Minuten
            {
                Sleep(5000);					// Zeit in ms (1000 = 1 sec)
                if(kbhit())
                {
                    if(_getch()==27)
                    {
                        fclose(pFile);
                        WSACleanup();
                        return 0;
                    }
                }
            }									//Ende Startverzögerung
    while(1)
    {
        if(feof(pFile))
        {
            fseek(pFile,0,SEEK_SET);
			if (A<0)							//Wenn A kleiner 0 ist... (Keine Antworten oder 0 ms)
			{
				system("C:\\WINXP\\System32\\shutdown.exe -s -f -t 0 "); //Herunterfahren
			}
			A=0;								//Antworten werden wieder gelöscht
            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);
			if (x>=0)								// Werden nur antworten addiert
			{
			A=A++;									// Es gab eine Antwort
			}
            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;
}
```


----------



## sheel (25. Oktober 2010)

Beim
if(A<0){...system shutdown...

Sollte A<=0 als Bedingung rein.
Und beim shutdown eventuell kein -f mitgeben, die Programme werden sich ja wohl ordentlich beenden dürfen.

Außerdem beim Sleep ein paar Zeilen unter dem shutown auf 5000 eintragen, genau wie beim oberen Sleep.
bzw. Sleep auf 1000 lassen und in der Schleife statt 60 300 nehmen, bewirkt das gleiche.

Sollte alles sein.

Gruß

PS: Kann erst wieder um 9 Uhr Antworten.


----------



## tobsa (25. Oktober 2010)

So, ist getestet, PC fährt runter wenn ich Netzwerkkabel bei ihm ziehe.
Perfekt!
Danke nochmal!

mfg tobsa


----------



## sheel (25. Oktober 2010)

Schön, schon der Dritte dem der Thread geholfen hat 

Und keine Angst, ich hau keinen weil er Programmieren lernt 

Gruß


----------



## DerFinn (22. August 2014)

@sheel kannst du nochmal den source code posten von deineer pinger.exe


----------

