1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

C++ IP-Liste einlesen und anpingen

Dieses Thema im Forum "C/C++" wurde erstellt von Alfons2, 9. September 2009.

  1. Alfons2

    Alfons2 Grünschnabel

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

    Code (Text):
    1.  
    2. 192.168.1.1 - [COLOR="Lime"]online[/COLOR]
    3. 192.168.1.6 - [COLOR="Lime"]online[/COLOR]
    4. 192.168.1.8 - [COLOR="Red"]offline[/COLOR]
    5. 192.168.1.22 - [COLOR="Red"]offline[/COLOR]
    6. 192.168.1.34 - [COLOR="Lime"]online[/COLOR]
    7.  
    wichtig sind auch die Farben!

    Also ich fang mal an:

    Code (Text):
    1.  
    2. #include <cstdlib>
    3. #include <iostream>
    4. #include <fstream>
    5.  
    6. using namespace std;
    7.  
    8.  
    9. int main(int argc, char *argv[])
    10. {
    11.    
    12. ifstream    filename;    
    13.     filename = liste.txt;
    14.  
    15.    
    16. do {
    17. file_stream.open("liste.txt", ios_base::out | ios_base::in);
    18.  
    19.  
    20.  
    21.  } while()
    22.  
    23. file_stream.close();
    24.  
    25.     system("PAUSE");
    26.     return EXIT_SUCCESS;
    27. }
    28.  
    Zuletzt bearbeitet: 9. September 2009
  2. Anfänger92

    Anfänger92 Erfahrenes Mitglied

    Hi,

    wenn cih deinen Code so seh ersma die Frage:
    Hast du Erfahrung mit C++ bzw. haste damit schonmal Programiert?
    Ich sag nur:
    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
    Code (C++):
    1. 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
    Zuletzt von einem Moderator bearbeitet: 23. Mai 2014
  3. Alfons2

    Alfons2 Grünschnabel

    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 :D
    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.
  4. Anfänger92

    Anfänger92 Erfahrenes Mitglied

    Such mal nach std::vector.

    MFG
    Anfänger
  5. Alfons2

    Alfons2 Grünschnabel

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

    sheel Mod # I love Asm Moderator

    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)
    Code (C++):
    1.  
    2. #define ICMP_ECHOREPLY 0
    3. #define ICMP_UNREACHABLE 3
    4. #define ICMP_ECHO 8
    5. #define ICMP_CODE_NETWORK_UNREACHABLE 0
    6. #define ICMP_CODE_HOST_UNREACHABLE 1
    7. #define ICMP_MIN_SIZE 8
    8. #define STATUS_FAILED 0xFFFF
    9. #define PING_FAILED 0xFFFFF0
    10. #define PING_TIMEOUT 0xFFFFF1
    11. #define PING_NOHOST 0xFFFFF2
    12.  
    13. unsigned short Ping_Checksum(unsigned short *buffer,int size){unsigned long cksum=0;while(size>1)
    14. {cksum+=*buffer++;size-=sizeof(unsigned short);}if(size){cksum+=*(unsigned char*)buffer;}
    15. cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return((unsigned short)(~cksum));}
    16.  
    17. unsigned int Ping_Ext(const char *ip,unsigned int datasize,int recvtimto){SOCKET sckSock;
    18. SOCKADDR_IN saDest,saFrom;int nRecvTimeOut=recvtimto;datasize+=sizeof(icmp_header_t);
    19. char *szICMPData=0;char szRecvBuff[65000+sizeof(ip_header_t)+sizeof(icmp_header_t)];DWORD dwStart,
    20. dwStop;if((sckSock=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP))==INVALID_SOCKET)return PING_FAILED;
    21. if(setsockopt(sckSock,SOL_SOCKET,SO_RCVTIMEO,(char *)&nRecvTimeOut,sizeof(nRecvTimeOut))==
    22. SOCKET_ERROR)return PING_FAILED;{unsigned long ulAddr=inet_addr(ip);HOSTENT *pHostEntity=0;
    23. if(ulAddr==INADDR_NONE){pHostEntity=gethostbyname(ip);memcpy(&ulAddr,pHostEntity->h_addr,
    24. pHostEntity->h_length);}saDest.sin_addr.s_addr=ulAddr;saDest.sin_family=(pHostEntity?pHostEntity->
    25. h_addrtype:AF_INET);saDest.sin_port=0;}{szICMPData=(char *)malloc(sizeof(icmp_header_t)+datasize+1);
    26. if(szICMPData==NULL)return PING_FAILED;((icmp_header_t *)szICMPData)->i_cksum=0;((icmp_header_t *)szICMPData)->i_code=0;
    27. ((icmp_header_t *)szICMPData)->i_id=(unsigned short)GetCurrentProcessId();((icmp_header_t *)szICMPData)->
    28. i_seq=0;((icmp_header_t *)szICMPData)->i_type=ICMP_ECHO;memset(szICMPData+sizeof(icmp_header_t),'.',datasize);
    29. memcpy(szICMPData+sizeof(icmp_header_t),"xyxyz pings",min(datasize,11));}{((icmp_header_t *)szICMPData)->
    30. timestamp=GetTickCount();((icmp_header_t *)szICMPData)->i_cksum=Ping_Checksum
    31. ((unsigned short *)szICMPData,datasize+sizeof(icmp_header_t));}if(sendto(sckSock,szICMPData,
    32. sizeof(icmp_header_t)+datasize,0,(SOCKADDR *)&saDest,sizeof(saDest))==SOCKET_ERROR)return
    33. PING_FAILED;dwStart=GetTickCount();while(1){int iResponseLen=0;{int nFromLen=sizeof(saFrom);
    34. iResponseLen=recvfrom(sckSock,szRecvBuff,65000+sizeof(ip_header_t)+sizeof(icmp_header_t),0,
    35. (SOCKADDR *)&saFrom,&nFromLen);dwStop=GetTickCount();if(iResponseLen==SOCKET_ERROR)
    36. {if(WSAGetLastError()==WSAETIMEDOUT)return PING_TIMEOUT;else{return PING_FAILED;}}}
    37. {ip_header_t *hdrIPHeader=(ip_header_t *)szRecvBuff;icmp_header_t *hdrICMPHeader
    38. =(icmp_header_t *)(szRecvBuff+hdrIPHeader->h_len*4);if(hdrICMPHeader->i_id!=
    39. (unsigned short)GetCurrentProcessId())continue;if(hdrICMPHeader->i_type==
    40. ICMP_UNREACHABLE)if(hdrICMPHeader->i_code==ICMP_CODE_HOST_UNREACHABLE||
    41. hdrICMPHeader->i_code==ICMP_CODE_NETWORK_UNREACHABLE)return PING_NOHOST;
    42. if(hdrICMPHeader->i_code==ICMP_ECHOREPLY)break;}}free(szICMPData);
    43. return dwStop-dwStart;}
    44.  
    45. int Ping(const char *ip,unsigned short int z=1000){int i=Ping_Ext(ip,32,z);
    46. if(i==PING_FAILED||i==PING_TIMEOUT||i==PING_NOHOST)return -1;return i;}
    47.  
    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 /?"
    Zuletzt bearbeitet: 9. September 2009
    RudolfG und Alfons2 sagen Danke.
  7. Alfons2

    Alfons2 Grünschnabel

    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,
    Code (Text):
    1.  
    2.  
    3. If (Ping_Ext == -1) {
    4. { cout << ip <<"offline\n";
    5. }
    6. else
    7. {
    8. cout << ip <<"online\n";
    9. }
    10.  
    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:
    Code (Text):
    1.  
    2. #include <iostream>
    3. #include <cstdio>
    4. #include <winsock2.h>
    5.  
    diese includiert, aber anscheinend brauch ich nochwas
    Zuletzt bearbeitet: 10. September 2009
  8. sheel

    sheel Mod # I love Asm Moderator

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

    Alfons2 Grünschnabel

    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

    Den Anhang Pinger.zip betrachten

    machs gut bis nachher alfi :)
  10. Alfons2

    Alfons2 Grünschnabel

    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
    Code (Text):
    1.  
    2. char ip[64];
    3. ...
    4. If (Ping(ip) == -1)
    5.  
    auswerten und anzeigen lassen.


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

    Code (Text):
    1. #include <windows.h>
    2. #include <cstdlib>
    3. #include <cstdio>
    4. #include <iostream>
    5. #include <fstream>
    6.  
    7.  
    8. // SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x0A);   <-- Schwarz:Grün
    9. // SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x0c);   <-- Schwarz;Rot    
    10. // SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x07);   <-- Schwarz;Grau Normale Konsole
    11. // cout << "Hallo Grüne Welt\n";
    12.  
    13. using namespace std;
    14.  
    15. int main()
    16. {
    17.  
    18.  
    19.   FILE * pFile;
    20.   pFile = fopen ("liste.txt", "w");   // Die IP-Liste wird geöffntet und Schreibrechte gesetzt
    21.   if (pFile==NULL)                   // Test ob das File existiert      
    22.   {
    23.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x0c);
    24.     cout << "Achtung! Die Datei 'liste.txt' konnte nicht geladen werden!\n";
    25.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x07);
    26.     fputs ("fopen example",pFile);
    27.     fclose (pFile);
    28.   }
    29.   else{
    30.       SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x0A);
    31.       cout << " Die Datei 'liste.txt' konnte erfolgreich geladen werden!\n";
    32.       SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x07);
    33.       }
    34. do{
    35.  
    36.  
    37.  
    38.  
    39. Sleep(600000); //10min warten
    40. }while(quiter == 0);
    41.  
    42.  
    43.  
    44.  
    45. system("pause");
    46. return 0;      
    47. }
    48.  
  11. sheel

    sheel Mod # I love Asm Moderator

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

    sheel Mod # I love Asm Moderator

    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
    Code (C++):
    1.  
    2. #include<stdio.h>
    3. #include<conio.h>
    4. #include<winsock2.h>
    5. #include<windows.h>
    6. #include"Ping_Ext.h"
    7.  
    8. char IsValidIP(char *ip,bool accwsp,char zuweis,bool tri){char p[32];
    9. int e1,e2,e3,e4=1;int i,j;if(accwsp){j=0;for(i=0;i<=(signed)strlen(ip);i++)
    10. {if(ip[i]!=32&&ip[i]!=' '&&ip[i]!=10&&ip[i]!=32){p[j]=ip[i];j++;}}}
    11. else{strcpy(p,ip);}j=0;for(i=0;i<(signed)strlen(p);i++){if((p[i]<'0'||p[i]>'9')
    12. &&p[i]!='.')return 0;if(p[i]=='.')j++;}if((j!=3&&(!tri))||(j!=2&&tri))return 0;
    13. if(!tri)sscanf(p,"%d.%d.%d.%d",&e1,&e2,&e3,&e4);else{sscanf(p,"%d.%d.%d",&e1,&e2,&e3);}
    14. if(e1<0||e2<0||e3<0||e4<0)return 0;if(e1>255||e2>255||e3>255||e4>255)return 0;if(zuweis)
    15. {if(tri){if(zuweis<2)sprintf(ip,"%.3d.%.3d.%.3d",e1,e2,e3);else{sprintf(ip,"%d.%d.%d",
    16. e1,e2,e3);}}else{if(zuweis<2)sprintf(ip,"%.3d.%.3d.%.3d.%.3d",e1,e2,e3,e4);
    17. else{sprintf(ip,"%d.%d.%d.%d",e1,e2,e3,e4);}}}return 1;}
    18.  
    19. int main()
    20. {
    21.     HANLDE han=(GetStdHandle(STD_OUTPUT_HANDLE);
    22.     FILE *pFile;
    23.     WSADATA wsastrct;
    24.     char ip[64],key;
    25.     int i;
    26.     if(WSAStartup(MAKEWORD(2,2),&wsastrct))return 0;
    27.     pFile=fopen("liste.txt","r");
    28.     if(pFile==NULL)    
    29.     {
    30.         SetConsoleTextAttribute(han,0x0c);
    31.         printf("Achtung! Die Datei 'liste.txt' konnte nicht geladen werden!\n");
    32.         SetConsoleTextAttribute(han,0x07);
    33.         system("pause");
    34.         WSACleanup();
    35.         return 0;
    36.     }
    37.     SetConsoleTextAttribute(han,0x0A);
    38.     printf(" Die Datei 'liste.txt' konnte erfolgreich geladen werden!\n");
    39.     SetConsoleTextAttribute(han,0x07);
    40.     while(1)
    41.     {
    42.         if(feof(pFile))
    43.         {
    44.             fseek(pFile,0,SEEK_SET);
    45.             for(i=0;i<60;i++)
    46.             {
    47.                 Sleep(1000);
    48.                 if(kbhit())
    49.                 {
    50.                     if(_getch()==27)
    51.                     {
    52.                         fclose(pFile);
    53.                         WSACleanup();
    54.                         return 0;
    55.                     }
    56.                 }
    57.             }
    58.             system("cls");
    59.         }
    60.         fgets(ip,64,pFile);
    61.         ip[63]='\0';
    62.         if(ip[strlen(ip)-1]=='\n')
    63.             ip[strlen(ip)-1]='\0';
    64.         if(!IsValidIP(ip,1,1,0))
    65.         {
    66.             printf("Nicht gültig: ");
    67.             puts(ip);
    68.         }
    69.         else
    70.         {
    71.             printf(ip);printf(": ");
    72.             if(Ping(ip)>=0)
    73.                 printf("Online\n");
    74.             else
    75.                 printf("Offline\n");
    76.         }
    77.         if(kbhit())
    78.         {
    79.             if(_getch()==27)
    80.             {
    81.                 fclose(pFile);
    82.                 WSACleanup();
    83.                 return 0;
    84.             }
    85.         }
    86.     }
    87.     fclose(pFile);
    88.     WSACleanup();
    89.     return 0;
    90. }
    91.  
    92.  
    Zuletzt bearbeitet: 10. September 2009
  13. Alfons2

    Alfons2 Grünschnabel

    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:eek:

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

    Wie z.B.

    Ich habe die ws2_32.lib schon eingebunden verschiedene Header eingebunden, hilft aber nicht sonderlich viel
    Alfons
    Zuletzt bearbeitet: 11. September 2009
  14. sheel

    sheel Mod # I love Asm Moderator

    Das mit den 10 min hab ich schon reinprogrammiert :)

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

    sonst weis ich auch nicht weiter
  15. Alfons2

    Alfons2 Grünschnabel

    Hm... trotz des Headers

  16. sheel

    sheel Mod # I love Asm Moderator

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

    Code (C++):
    1.  
    2. typedef struct{unsigned int h_len:4;unsigned int version:4;unsigned char tos;
    3.     unsigned short total_len;unsigned short ident;unsigned short frag_and_flags;
    4.     unsigned char ttl;unsigned char proto;unsigned short checksum;unsigned int sourceIP;
    5.     unsigned int destIP;}ip_header_t;
    6. typedef struct{char i_type;char i_code;unsigned short i_cksum;unsigned short i_id;
    7.     unsigned short i_seq;unsigned long timestamp;}icmp_header_t;
    8.  
    Was ich noch vergessen habe zu erwähnen: Die Esc-Taste beendet das Programm
    Zuletzt bearbeitet: 11. September 2009
  17. Alfons2

    Alfons2 Grünschnabel

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

    sheel Mod # I love Asm Moderator

    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
    Code (C++):
    1.  
    2. else
    3. {
    4.     printf(ip);
    5.     printf(": ");
    6.     if(Ping(ip)>=0)
    7.         printf("Online\n");
    8.     else
    9.         printf("Offline\n");
    10. }
    11.  
    in das:
    Code (C++):
    1.  
    2. else
    3. {
    4.     printf(ip);
    5.     printf(": ");
    6.     int x=Ping(ip);
    7.     if(x>=0)
    8.         printf("Online, hat %d Millisekunden gebraucht\n",x);
    9.     else
    10.         printf("Offline\n");
    11. }
    12.  
    Das wärs, mehr musst du nicht ändern

    Gruß
  19. Alfons2

    Alfons2 Grünschnabel

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

    Habe es so ähnlich versucht, habe mit
    Code (C++):
    1. cout  << "Online" << Ping(ip) << endl;[code=cpp]
    2. versucht, aber da war der Wert auch Null :(
  20. RaVenC

    RaVenC Grünschnabel

Diese Seite empfehlen