primitives Programm um alle 254 IPs in einem Netzwerk anzupingen.
// multiping / richard@borwinius.de /2012 // pingt in der angegebenen IPrange 254 Hosts durch // Bsp: multiping.exe 10.10.14 1 // kompilieren mit: lc multiping.c #include <windows.h> #include <winsock.h> #include <stdio.h> #include <string.h> #include <tcconio.h> typedef struct tagIPINFO { u_char Ttl; // Time To Live u_char Tos; // Type Of Service u_char IPFlags; // IP flags u_char OptSize; // Size of options data u_char FAR *Options; // Options data buffer }IPINFO, *PIPINFO; typedef struct tagICMPECHO { u_long Source; // Source address u_long Status; // IP status u_long RTTime; // Round trip time in milliseconds u_short DataSize; // Reply data size u_short Reserved; // Unknown void FAR *pData; // Reply data buffer IPINFO ipInfo; // Reply options }ICMPECHO, *PICMPECHO; // ICMP.DLL Export Function Pointers HANDLE (WINAPI *pIcmpCreateFile)(VOID); BOOL (WINAPI *pIcmpCloseHandle)(HANDLE); DWORD (WINAPI *pIcmpSendEcho) (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD); //-------------------------------------------------------------------------- //Fehlermeldung als Text ausgeben void DisplayErrorText(DWORD dwLastError) { HMODULE hModule = NULL; // default to system source LPSTR MessageBuffer; DWORD dwBufferLength; DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM ; // // Call FormatMessage() to allow for message // text to be acquired from the system // or from the supplied module handle. // if(dwBufferLength = FormatMessageA( dwFormatFlags, NULL,//hModule, // module to get message from (NULL == system) dwLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language (LPSTR) &MessageBuffer, 0, NULL )) { DWORD dwBytesWritten; printf("%05d\t0x%x\t%s\n",dwLastError,dwLastError,MessageBuffer); // // Output message string on stderr. // //WriteFile( GetStdHandle(STD_ERROR_HANDLE),MessageBuffer, dwBufferLength, &dwBytesWritten, NULL ); // // Free the buffer allocated by the system. // LocalFree(MessageBuffer); } // // If we loaded a message source, unload it. // if(hModule != NULL) FreeLibrary(hModule); } //---------------------------------------------------------------------------- // host oder ip anpingen int icmpping(char * HOSTorIP,unsigned int pz) { WSADATA wsaData; // WSADATA ICMPECHO icmpEcho; // ICMP Echo reply buffer HANDLE hndlIcmp; // LoadLibrary() handle to ICMP.DLL HANDLE hndlFile; // Handle for IcmpCreateFile() LPHOSTENT pHost; // Pointer to host entry structure struct in_addr iaDest; // Internet address structure DWORD *dwAddress; // IP Address IPINFO ipInfo; // IP Options structure int nRet; // General use return code DWORD dwRet; // DWORD return code int x; // Dynamically load the ICMP.DLL hndlIcmp = LoadLibrary("ICMP.DLL"); if (hndlIcmp == NULL) { fprintf(stderr,"\nKonnte ICMP.DLL nicht laden\n"); return GetLastError(); } // Retrieve ICMP function pointers pIcmpCreateFile = (HANDLE (WINAPI *)(void)) GetProcAddress(hndlIcmp,"IcmpCreateFile"); pIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE)) GetProcAddress(hndlIcmp,"IcmpCloseHandle"); pIcmpSendEcho = (DWORD (WINAPI *) (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD)) GetProcAddress(hndlIcmp,"IcmpSendEcho"); // Check all the function pointers if (pIcmpCreateFile == NULL || pIcmpCloseHandle == NULL || pIcmpSendEcho == NULL) { fprintf(stderr,"\nError getting ICMP proc address\n"); FreeLibrary(hndlIcmp); return GetLastError(); } // Init WinSock nRet = WSAStartup(0x0101, &wsaData ); if (nRet) { fprintf(stderr,"\nWSAStartup() error: %d\n", nRet); WSACleanup(); FreeLibrary(hndlIcmp); return nRet; } // Check WinSock version if (0x0101 != wsaData.wVersion) { nRet = GetLastError(); fprintf(stderr,"\nWinSock version 1.1 not supported\n"); WSACleanup(); FreeLibrary(hndlIcmp); return nRet; } // Lookup destination // Use inet_addr() to determine if we're dealing with a name // or an address iaDest.s_addr = inet_addr(HOSTorIP); if (iaDest.s_addr == INADDR_NONE) pHost = gethostbyname(HOSTorIP); else pHost = gethostbyaddr((const char *)&iaDest, sizeof(struct in_addr), AF_INET); if (pHost == NULL) { nRet = GetLastError(); textcolor(LIGHTRED); fprintf(stderr, "\n%s nicht gefunden \n", HOSTorIP); //cprintf("\n%s nicht gefunden\n",argv[1]); textcolor(LIGHTGRAY); WSACleanup(); FreeLibrary(hndlIcmp); return nRet; } // Tell the user what we're doing printf("\nIch pinge %s [%s]\n", pHost->h_name, inet_ntoa((*(LPIN_ADDR)pHost->h_addr_list[0]))); // Copy the IP address dwAddress = (DWORD *)(*pHost->h_addr_list); // Get an ICMP echo request handle hndlFile = pIcmpCreateFile(); for (x = 0; x < pz; x++) // Pinganzahl { // Set some reasonable default values ipInfo.Ttl = 255; ipInfo.Tos = 0; ipInfo.IPFlags = 0; ipInfo.OptSize = 0; ipInfo.Options = NULL; icmpEcho.ipInfo.Ttl = ipInfo.Ttl; // Reqest an ICMP echo dwRet = pIcmpSendEcho( hndlFile, // Handle from IcmpCreateFile() *dwAddress, // Destination IP address NULL, // Pointer to buffer to send 0, // Size of buffer in bytes &ipInfo, // Request options &icmpEcho, // Reply buffer sizeof(struct tagICMPECHO), 5000); // Time to wait in milliseconds // Print the results iaDest.s_addr = icmpEcho.Source; textcolor(LIGHTGREEN); cprintf("\nAntwort von %s Antwortzeit = %ld ms TTL = %d", inet_ntoa(iaDest), icmpEcho.RTTime, icmpEcho.ipInfo.Ttl); textcolor(LIGHTGRAY); if (icmpEcho.Status) { nRet = GetLastError(); textcolor(LIGHTRED); cprintf("\n\nFehler : icmpEcho.Status=%ld\n", icmpEcho.Status); textcolor(LIGHTGRAY); //break; DisplayErrorText(icmpEcho.Status); } } printf("\n"); // Close the echo request file handle pIcmpCloseHandle(hndlFile); FreeLibrary(hndlIcmp); WSACleanup(); return GetLastError(); } //----------------------------------------------------------------------------- int main(int argc, char **argv) { int pversuche = 0; int ret = 0; int i = 0; char hosts[254]; // Check arguments if (argc != 3) { fprintf(stderr,"\nSyntax: %s iprange Pingversuche\n",argv[0]); fprintf(stderr,"\nBeispiel: %s 10.10.14 1\n",argv[0]); return GetLastError(); } else { pversuche = abs(atoi(argv[2])); if (pversuche !=0) { for (i = 1; i < 255; i++) // hosts durchhecheln { wsprintf(hosts,"%s.%d\n",argv[1],i); ret = icmpping(hosts,pversuche); if (ret != 0) { DisplayErrorText(ret); } } } else { return GetLastError(); } } } //-----------------------------------------------------------------------------