1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
| #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;
} |