Ping



  • Hi,
    ich will einfach nur einen Ping senden um herauszufinden ob eine Verbindung zu Internet besteht. Ich will nicht unbedingt die Zeit wissen! Aber wie sende ich einen Ping und überprüfe ob er zurückkommt?
    hab schon gesucht, was mir aber alles zu komplex (hab was gefunden, wo 3x ein Ping gesendet wird und dann der Mittelwert gebildet wird)! Achso fast hätte ichs vergessen, ich darf, kann und will nicht Indy verwenden!

    Also wie kann ich einen solchen einfachen Ping senden!

    Danke

    Alexander Sulfrian



  • wieso kannst, willst und darfst du indy net benutzen? *doof-frag*
    damit is das soooooo einfach!! einfach die IdICMP-Komponente benutzen, mit der geht das total easy!

    J0



  • Hi,
    is für die Schule und unsere Lehrer sagen, wir sollen zumindest eine Version habe, die ohne solche Komponenten (z.B. Indy) geschrieben ist [Quelltext sollen wir natürlich verstehen]! Die Lehrer sagen, dass wir eine 2. Version gerne mit Indy machen können, aber nicht die Hauptversion! Blöde Lehrer!

    Danke

    Alexander Sulfrian

    [ Dieser Beitrag wurde am 15.04.2003 um 00:04 Uhr von Alexander Sulfrian editiert. ]





  • Vielleicht hilft das?
    http://www.bytesandmore.de/rad/

    Der Code-Schnipsel nennt sich "IMCP-Ping an eine IP-Adresse senden"



  • Hi,
    danke hat geklappt!

    Danke

    Alexander Sulfrian



  • Hi,
    leider zu früh gefreut! Der Code (http://www.bytesandmore.de/rad/) von erzeugt immer einen Fehler! Ich bekomme nie eine Antwort! Ich bekomme immer IcmpEcho-Status: 11010? Meine Zieladresse ist www.freesql.org ?

    Was mache ich falsch?

    Danke

    Alexander Sulfrian

    PS: Ich hab den Code etwas verändert ich hoffe naicht das es daran liegt! Hier mein Code:

    siehe unten! neuerer Quelltext

    [edit]Tabs im Quelltext verändert![/edit]
    [edit]Ach ich verstehe das nicht, beim editieren sieht alles ordentlich aus?! Naja falsche Einrückungen einfach ignorieren[/edit]

    [edit]Quelltext weg editiert! steht ja unten besser![/edit]

    [ Dieser Beitrag wurde am 15.04.2003 um 19:38 Uhr von Alexander Sulfrian editiert. ]



  • Hi,
    übrigens auch Indy gibt mir nur ein rsTimeOut zurück!
    [edit]Nachdem mir auch der cmd Befehl, TimeOut versichert hat, denke ich liegt es an der I-Net-Adresse! Aber es muss trotzdem noch einen Fehler im Code geben, denn auch bei z.B. www.c-plusplus.net bekommen ich time = -1! Also wo steckt der Fehler?[/edit]

    Danke

    Alexander Sulfrian

    [ Dieser Beitrag wurde am 15.04.2003 um 19:09 Uhr von Alexander Sulfrian editiert. ]



  • Hi,
    hab Fehler gefunden:
    hatte wahrscheinlich diese Zeile:

    return ilRetVal = ilCount ? ilTimeSum/ilCount : -1;
    

    falsch umgesetzt!

    Hier noch mal mein kompletter Code:

    // Ping senden
     int time;
     AnsiString slAddress = "www.c-plusplus.net";
    
     // Definition der IP-Optionenstruktur
     typedef struct tagIPINFO
     {
       BYTE bTimeToLive;    // Time To Live
       BYTE bTypeOfService; // Type Of Service
       BYTE bIpFlags;       // IP-Flags
       BYTE OptSize;        // Grösse der Options Data Buffers
       BYTE FAR *Options;   // Zeiger auf Options Data Buffer
     } IPINFO, *PIPINFO;
     // Definition der ICMP-Echo Antwortstruktur
     typedef struct tagICMPECHO
     {
       DWORD dwSource;     // Zieladresse
       DWORD dwStatus;     // IP-Status
       DWORD dwRTTime;     // Round Trip Time in Millisekunden
       WORD  wDataSize;    // Grösse des Antwort-Buffers
       WORD  wReserved;
       void FAR *pData;    // Zeiger auf die Antwort-Daten
       IPINFO ipInfo;      // Antwort-Optionen
     } ICMPECHO, *PICMPECHO;
    
     // Zeiger auf die Funktionen aus der ICMP.DLL deklarieren, für PING:
     typedef HANDLE (WINAPI *PF_CMPCREATEFILE)(VOID);
     typedef BOOL   (WINAPI *PF_ICMPCLOSEHANDLE)(HANDLE);
     typedef DWORD  (WINAPI *PF_ICMPSENDECHO)(HANDLE,DWORD,LPVOID,WORD,
                     PIPINFO,LPVOID,DWORD,DWORD);
    
     // ICMP.DLL laden:
     HANDLE hIcmp = LoadLibrary("ICMP.DLL");
     if(hIcmp == NULL)
     {
      ShowMessage("Could not load ICMP.DLL");
      time = -1;
     }
     else
     {
      // Zeiger auf die Funktionen besorgen:
      PF_CMPCREATEFILE pfIcmpCreateFile = (PF_CMPCREATEFILE)
      GetProcAddress(hIcmp, "IcmpCreateFile");
    
      PF_ICMPCLOSEHANDLE pfIcmpCloseHandle = (PF_ICMPCLOSEHANDLE)
      GetProcAddress(hIcmp,"IcmpCloseHandle");
    
      PF_ICMPSENDECHO pfIcmpSendEcho = (PF_ICMPSENDECHO)
      GetProcAddress(hIcmp,"IcmpSendEcho");
    
      // Funktionszeiger prüfen:
      if (pfIcmpCreateFile == NULL || pfIcmpCloseHandle == NULL ||
        pfIcmpSendEcho == NULL)
      {
        ShowMessage("Error getting ICMP proc address");
        FreeLibrary(hIcmp);
        time = -1;
      }
      else
      {
       // WinSock initialisieren
       WSADATA wsaData;
       int ilRetVal = WSAStartup(0x0101, &wsaData );
       if(ilRetVal)
       {
        ShowMessage("Winsock-Initialsierungsfehler: " + IntToStr(ilRetVal));
        WSACleanup();
        FreeLibrary(hIcmp);
        time = -1;
       }
    
       // Check WinSock version
       if(0x0101 != wsaData.wVersion)
       {
        ShowMessage("Fehler: Winsock Version 1.1 oder höher nicht vorhanden !");
        WSACleanup();
        FreeLibrary(hIcmp);
        time = -1;
       }
       else
       {
        // Prüfen, ob es sich bei der Zieladresse um IP-Adresse handelt und
        // ggf. den die Adresse zum Namen ermitteln:
        struct in_addr iaDest;  // Struktur für die Internet-Adresse
        iaDest.s_addr = inet_addr(slAddress.c_str());
        LPHOSTENT pHost;  // Zeiger auf die Host Entry Struktur
        if (iaDest.s_addr == INADDR_NONE) pHost = gethostbyname(slAddress.c_str());
        else pHost = gethostbyaddr((BYTE *)&iaDest, sizeof(struct in_addr), AF_INET);
        if(pHost == NULL)
        {
         ShowMessage("Fehler: Adresse " + slAddress + " wurde nicht gefunden !");
         WSACleanup();
         FreeLibrary(hIcmp);
         time = -1;
        }
        else
        {
         // IP-Adresse kopieren
         DWORD* pAddress = (DWORD*)(*pHost->h_addr_list);
         // ICMP Echo Request Handle besorgen:
         HANDLE hIcmpFile = pfIcmpCreateFile();
         ICMPECHO icmpEcho;      // ICMP-Echo Antwortbuffer
         IPINFO ipInfo;          // IP-Optionenstruktur
    
         // Default-Werte festlegen:
         ::ZeroMemory(&ipInfo, sizeof(ipInfo));
         ipInfo.bTimeToLive = 255;
         // ICMP Echo anfordern:
         pfIcmpSendEcho(hIcmpFile, *pAddress, NULL, 0, &ipInfo, &icmpEcho,
              sizeof(struct tagICMPECHO), 5000);
    
         // Ergebnisse:
         iaDest.s_addr = icmpEcho.dwSource;
    
         // falls Fehler aufgetreten:
         if(icmpEcho.dwStatus)
         {
          ShowMessage("Fehler: IcmpEcho-Status=" + IntToStr(icmpEcho.dwStatus));
          time = -1;
         }
    
         // Echo-Request File Handle schliessen:
         pfIcmpCloseHandle(hIcmpFile);
         // ICMP.DLL freigeben:
         FreeLibrary(hIcmp);
         // Winsock schliessen:
         WSACleanup();
    
         // Fehler?
         time = icmpEcho.dwRTTime;
        }
       }
      }
     }
    
     ShowMessage(time);
    

    Bleibt nur noch die Frage, wie ich einen Ping an www.freesql.org senden kann? Oder wie ich sonst herausbekomme ob diese Seite erreichbar ist?

    Danke

    Alexander Sulfrian

    Edit: Code-Tags berichtigt

    [ Dieser Beitrag wurde am 15.04.2003 um 19:23 Uhr von Alexander Sulfrian editiert. ]


Anmelden zum Antworten