problem mit "time" einfügen



  • nabend mädels

    also, ich hab in mein programm so eine art log datei eingebaut, es wird dort dargestellt was grad passiert und dort möchte ich noch die zeit angegeben haben. hab bloß keine ahnung wie ich das machen soll.

    also hier ist code 1

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    #include <winsock.h>
    #include "ping.h"
    #include <conio.h>
    #include <windows.h>
    #include <stdio.h>
    #include <iostream.h>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;  TStrings* pStrings;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    
    }
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    
    // 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: 
    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); 
    
    //--------------------------------------------------------------------------- 
    // Funktion PingHost() sendet ein IMCP-Echo Request (Ping) an den Rechner 
    // mit der im Parameter slAddress übergebenen Adresse (oder Namen) 
    //---------------------------------------------------------------------------
    // Übergabeparameter: 
    // 
    // AnsiString slAddress : IP-Adresse oder Name des Zielrechners 
    // TStrings* pStrings   : Zeiger auf eine TStrings-Instanz für die 
    //                        Ausgabe von Statusmeldungen 
    //--------------------------------------------------------------------------- 
    // Rückgabewert:        : Round Trip Time des Echo Request (die Zeit von dem
    //                        Anfragezeitpunkt bis zum Empfang der Antwort) 
    //                        in Millisekunden bei erfolgreicher Ausführung oder 
    //                        -1 beim Auftreten von Fehlern 
    //--------------------------------------------------------------------------- 
    // Beispielaufrufe: 
    // 
    // int ilTripTime = PingHost("xxx.xxx.xxx.xxx", Memo1->Lines);
    // int ilTripTime = PingHost("test_host", NULL); 
    //--------------------------------------------------------------------------- 
    
    int PingHost(AnsiString slAddress, TStrings* pStrings) 
     { 
      // Stringsliste leeren: 
      //if(pStrings) pStrings->Clear();
    
      // ICMP.DLL laden: 
      HANDLE hIcmp = LoadLibrary("ICMP.DLL"); 
      if(hIcmp == NULL) 
      { 
        if(pStrings) pStrings->Add("Could not load ICMP.DLL"); 
        return -1;
      } 
    
      // 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) 
      {
        if(pStrings) pStrings->Add("Error getting ICMP proc address"); 
        FreeLibrary(hIcmp); 
        return -1; 
      } 
    
      // WinSock initialisieren 
      WSADATA wsaData;
      int ilRetVal = WSAStartup(0x0101, &wsaData ); 
      if(ilRetVal) 
      { 
        if(pStrings) 
          pStrings->Add("Winsock-Initialsierungsfehler: " + IntToStr(ilRetVal)); 
        WSACleanup(); 
        FreeLibrary(hIcmp);
        return -1; 
      } 
      // Check WinSock version 
      if(0x0101 != wsaData.wVersion) 
      { 
        if(pStrings) 
          pStrings->Add("Fehler: Winsock Version 1.1 oder höher nicht vorhanden !");
        WSACleanup(); 
        FreeLibrary(hIcmp); 
        return -1; 
      } 
    
      // 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) 
      {
        if(pStrings) 
          pStrings->Add("Fehler: Adresse " + slAddress + " wurde nicht gefunden !"); 
        WSACleanup(); 
        FreeLibrary(hIcmp); 
        return -1; 
      }
    
      VOID GetLocalTime(LPSYSTEMTIME lpst)
    
       char szProtokoll[100+1];
        SYSTEMTIME st;
    
      if(pStrings)
        GetLocalTime(&st);
    sprintf(szProtokoll, "%02d.%02d.%04d %02d:%02d:%02d | ", st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond);
        pStrings->Add(AnsiString(szProtokoll) + "Ping an " + AnsiString(pHost->h_name) + "[" +
          AnsiString(inet_ntoa((*(LPIN_ADDR)pHost->h_addr_list[0]))) + "]");
    
      // 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 
    
      int ilTimeSum = 0;      // Summe der Round Trip Time-Daten 
      int ilCount   = 0;      // Anzahl der Round Trip Time-Daten 
    
      for (int ilPingNo = 0; ilPingNo < 3; ilPingNo++) 
      { 
        // Default-Werte festlegen: 
        ::ZeroMemory(&ipInfo, sizeof(ipInfo));
        ipInfo.bTimeToLive = 255; 
        // ICMP Echo anfordern: 
        pfIcmpSendEcho(hIcmpFile,   // Handle von IcmpCreateFile() 
                       *pAddress,   // Ziel-IP Addresse
                        NULL,       // Zeiger auf den Buffer mit den 
                                    // zu sendenden Daten 
                        0,          // Buffergrösse in Bytes
                        &ipInfo,    // Request-Optionen 
                        &icmpEcho,  // Antwort-Buffer 
                        sizeof(struct tagICMPECHO), // Buffergrösse 
                        5000);      // Max. Wartezeit in Millisekunden 
    
        // Ergebnisse anzeigen: 
        iaDest.s_addr = icmpEcho.dwSource;
        if(pStrings) 
        { 
          AnsiString slMessage = "Antwort von "+AnsiString( 
            inet_ntoa(iaDest))+ ": Zeit=" + IntToStr(icmpEcho.dwRTTime) + 
            " ms, Time to Live=" + IntToStr(icmpEcho.ipInfo.bTimeToLive) + " ms"; 
          pStrings->Add(slMessage); 
        }
        // falls Fehler aufgetreten: 
        if(icmpEcho.dwStatus) 
        { 
          if(pStrings) 
            pStrings->Add("Fehler: IcmpEcho-Status=" + IntToStr(icmpEcho.dwStatus)); 
          break; 
        }
        ilTimeSum += icmpEcho.dwRTTime; 
        ilCount++; 
        if(ilPingNo < 2) Sleep(200); 
      } 
    
      // Echo-Request File Handle schliessen: 
      pfIcmpCloseHandle(hIcmpFile);
      // ICMP.DLL freigeben: 
      FreeLibrary(hIcmp); 
      // Winsock schliessen: 
      WSACleanup(); 
    
      // Den Mittelwert aller Round Trip Times zurückgeben: 
      return ilRetVal = ilCount ? ilTimeSum/ilCount : -1;
    }
    
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Timer1->Enabled = true;
    PingHost(Edit1->Text,RichEdit1->Lines);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    Close();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::RichEdit1Change(TObject *Sender)
    {
          RichEdit1->Perform(EM_SCROLLCARET, 0, 0);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    Timer1->Enabled = false;
    }
    
    //---------------------------------------------------------------------------
    

    und das is "code"2,glaub i zumindest, der soll in code 1

    time_t time(time_t *timer);
    

    das ganze soll dann so aussehen
    07/21/03 15:42:09: ***** ************ *****.
    07/21/03 15:42:14: *********** ***********.

    hoffe mal es ist nicht zu kompliziert geworden.

    edit: 02.08.03| hab jetzt mal versucht alles einzubauen, was ihr mir gesagt habt.das ist jetzt mein kompletter code!



  • Schau dir mal GetSystemTime an
    oder GetLocalTime

    Nimm die Werte aus der Structur lpSystemTime und bau dir das Datum passend zusammen ich nehme dafür meistens sprintf



  • sorry aber irgendwie bin ich zu blöd das zu verstehen.

    das mit GetSystemTime und GetLocalTime hab ich verstanden aber ich kann hiermit nix anfangen

    Nimm die Werte aus der Structur lpSystemTime und bau dir das Datum passend zusammen



  • Na so hier z. B.

    GetLocalTime(&st);
    sprintf(szProtokoll, "%02d.%02d.%04d %02d:%02d:%02d | ..... ...... .......\n", st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond);
    

    ..dann steht in szProtokoll:
    28.07.2003 18:07:55 | ..... ...... .......



  • woa, danke für eure hilfe @ PAD und Hepi

    nu is es mir echt peinlich das zu fragen aber wie bekomm ich das in meinen code 😕 denn bis jetzt gibt er es so aus

    Ping an rumpelstiel[192.168.0.82]
    Antwort von 192.168.0.82: Zeit=0 ms, Time to Live=128 ms

    das ergebnis soll ja dann so aussehen

    28.07.2003 18:07:55|Ping an rumpelstiel[192.168.0.82]
    Antwort von 192.168.0.82: Zeit=0 ms, Time to Live=128 ms

    ich denke wo man es einbauen könnte wäre hier(im letzten drittel des codes zu finden)

    if(pStrings) 
        pStrings->Add("Ping an " + AnsiString(pHost->h_name) + "[" + 
          AnsiString(inet_ntoa((*(LPIN_ADDR)pHost->h_addr_list[0]))) + "]");
    

    für andere vorschläge bin ich sehr dankbar



  • Hepi hat in szProtokoll das Eregbenis der Zeit gespeichert.
    Ändere das so ab

    if(pStrings)  
    {
    GetLocalTime(&st); 
    sprintf(szProtokoll, "%02d.%02d.%04d %02d:%02d:%02d | ", st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond);
        pStrings->Add(AnsiString(szProtokoll) + "Ping an " + AnsiString(pHost->h_name) + "[" +  
          AnsiString(inet_ntoa((*(LPIN_ADDR)pHost->h_addr_list[0]))) + "]");
     }
    

    😃 Ich hoffe das es funktioniert, ich habs mal wieder nicht getestet. 😃



  • [C++ Fehler] ping.cpp(144): E2451 Undefiniertes Symbol 'st'
    [C++ Fehler] ping.cpp(145): E2268 Aufruf der undefinierten Funktion 'sprintf'
    [C++ Fehler] ping.cpp(145): E2451 Undefiniertes Symbol 'szProtokoll'
    

    so, das sind die fehlermeldungen die mein bcb6 ausspuckt. ansonsten scheint es zu funktionieren.



  • Fehler 1: Durch Blick in die Hilfe findet man

    The GetLocalTime function retrieves the current local date and time.

    VOID GetLocalTime(
    LPSYSTEMTIME lpSystemTime // system time
    );

    => LPSYSTEMTIME st

    Fehler 2: Durch Blick in die Hilfe findet man
    #include <stdio.h>

    Fehler 3:

    Einen String definiert man wie folgt:

    char szProtokoll[100+1];

    Steht in jedem Tutorial und C-Buch

    Bei dem was du gepostet hast, ging zumindest ich davon aus dsd C-grundlagen da sind

    // Begin of file
    // Hier sollte ein Kommentar stehen was das File tun soll und wann es zum letzten mal geändert wurde
    // und wer es erstellt hat
    #include <stdio.h>
    
    int func1(void)
    {
    char  szProtokoll[100+1]; //Damit erzeugst du einen String der 100 Zeichen speichern kann 
                              //das +1 ist eine Marotte von mir um den üblichen Fehler zu vermeiden 
                              //das für die shließende Null kein Platz mehr da ist 
    LPSYSTEMTIME st;
    
    if(pStrings)   
    { 
    GetLocalTime(&st);  
    sprintf(szProtokoll, "%02d.%02d.%04d %02d:%02d:%02d | ", st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond); 
        pStrings->Add(AnsiString(szProtokoll) + "Ping an " + AnsiString(pHost->h_name) + "[" +   
          AnsiString(inet_ntoa((*(LPIN_ADDR)pHost->h_addr_list[0]))) + "]"); 
     }
    
    return 0;
    }
    


  • PAD schrieb:

    Bei dem was du gepostet hast, ging zumindest ich davon aus dsd C-grundlagen da sind

    ...da ging ich auch von aus 😞

    Allerdings ist st nicht LPSYSTEMTIME, sondern SYSTEMTIME (den Pointer übergeb ich ja mit dem &st an GetLocalTime(&st))

    Ansonsten sieht das gut aus...



  • @Hepi 😃 stimmt, hatte den Variablentyp aus der MS Hilfe einfach kopiert und das & Zeichen übersehen 😃



  • danke euch beiden und sorry das ich euren erwartungen nicht gerecht geworden bin. hab erst vorkurzem mit dem thema angefangen.

    jedenfalls hab ich euren code jetzt soweit "bearbeitet" das nur noch eine fehlermeldung kommt. und zwar hat er ein problem mit der geschweiften klammer über char *[C++ Fehler] ping.cpp(144): E2141 Fehler in der Deklarationssyntax
    *der hatte vorher noch mehr fehler gemeldet,pAdress mochte er nicht mehr, als ich unter return 0; die geschweifte klammer weggenommen hab, kommt jetzt nur noch die eine fehlermeldung.



  • @Haudegen

    diese Func1 war ein Beispiel wie man die von dir gesuchten Teile nutzt.

    Du sollst nicht dies Funktion includen, sondern in deinen bestehenden Code die Änderungen vornehmen
    d.h.
    --> am Begin des Funktionsbodys die 2 Variablen st und szBuffer deklarieren
    --> an der stelle wo in deinem Code das if vorkommt, diese Stücke an der richtigen Stelle hinzufügen.
    --> Mit GetLocal... bekommst du die aktuelle Zeit in st geliefert, muß im if sein damit die Zeit genommen wird zu der du in dem if bist.
    --> Das sprintf kann unmittelbar folgen.
    --> dein pStrings->Add muß an der Stelle sein wo du deine Informationen vollständig hast.

    danke euch beiden und sorry das ich euren erwartungen nicht gerecht geworden bin. hab erst vorkurzem mit dem thema angefangen.

    👍 Du brauchst sich nicht zu entschuldigen, du hattest nur nicht erwähnt das du Anfänger bist. Somit passten die
    Antworten zum Code und nicht zu deinem Wissensstand.

    Viel Spaß und frag bitte weiter
    PAD



  • danke für deine hilfe PAD. werd mich erstmal ne weile damit noch beschäftigen. denn irgendwie muss ich ja mal was lernen. kann ja nicht die ganze zeit euch fragen.
    wenn ich absolut nicht mehr weiter komme, dann meld ich mich hier noch mal!

    hab jetzt schon probleme die variablen zu deklarieren 😞 (peinlich!!!) aber das will ich alleine lösen!!!

    bye euer Haudegen



  • 😞 da bin ich wieder.

    hab da jetzt mal n kleines bisserl rumgebastelt. hab nur noch ein problem mit szProtokoll, ich bekomme es einfach nicht definiert.
    hier erstmal der code

    #include <vcl.h>
    #pragma hdrstop
    #include <winsock.h>
    #include "ping.h"
    #include <conio.h>
    #include <windows.h>
    #include <stdio.h>
    #include <iostream.h>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    //das steht in meinem header (???), ich schreib das hier weil ich irgendwas in der hilfe mal gesehen hab zwecks #include + szBuffer.
    
    VOID GetLocalTime(LPSYSTEMTIME lpst)
      char* szProtokoll = new char[100+1];
      SYSTEMTIME st;
    
      if(pStrings)
        GetLocalTime(&st);
    sprintf(szProtokoll, "%02d.%02d.%04d %02d:%02d:%02d | ", st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond);
        pStrings->Add(AnsiString(szProtokoll) + "Ping an " + AnsiString(pHost->h_name) + "[" +
          AnsiString(inet_ntoa((*(LPIN_ADDR)pHost->h_addr_list[0]))) + "]");
    

    so und nun noch die fehlermeldungen, die ich im obenstehenden code abschnitt bekomme.
    [C++ Fehler] ping.cpp(145): E2141 Fehler in der Deklarationssyntax -> bei "char* szProtokoll...." zu finden
    [C++ Fehler] ping.cpp(149): E2451 Undefiniertes Symbol 'szProtokoll'
    für hilfe und änderungsvorschläge wäre ich sehr dankbar.
    mfg
    euer Haudegen



  • Hi,
    fehlt bei der funktionsdeklaration nicht ne geschweifte Klammer ?



  • mag sein aber wenn ich es so mache

    VOID GetLocalTime(LPSYSTEMTIME lpst)
      {
       char* szProtokoll = new char[100+1];
        SYSTEMTIME st;
    
      if(pStrings)
        GetLocalTime(&st);
    sprintf(szProtokoll, "%02d.%02d.%04d %02d:%02d:%02d | ", st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond);
        pStrings->Add(AnsiString(szProtokoll) + "Ping an " + AnsiString(pHost->h_name) + "[" +
          AnsiString(inet_ntoa((*(LPIN_ADDR)pHost->h_addr_list[0]))) + "]");
        }
    

    dann mag er die geschweifte klammer über char* nicht und er mag dann noch eine andere stelle im gesamten code nicht mehr.
    [C++ Fehler] ping.cpp(146): E2141 Fehler in der Deklarationssyntax
    [C++ Fehler] ping.cpp(177): E2451 Undefiniertes Symbol 'pAddress'
    -> bisserl weiter unten im code



  • Warum änderst du szProtokoll ab funktionierte es nich?

    char szProtokoll[100+1]; //Damit erzeugst du einen String der 100 Zeichen speichern kann
    //das +1 ist eine Marotte von mir um den üblichen Fehler zu vermeiden
    //das für die shließende Null kein Platz mehr da ist

    Dynamische Allokierung ist ein sinnvolle Methode, wenn ich aber eine so kurze Routine habe kann ich eine temporäre Variable ruhig auch statisch anlegen. Die Zeit es auf dem Stack für die Lebensdauer dieser Routine ist deutlich kürzer als eine new delete Pärchen, speziell wenn man das delete vergisst. Typischer Fehler eine Routine hat an zwei oder mehr Stellen ein return stehen, das
    heißt an jedem return müsste ein deletes stehen.

    Hast du dier mal überlegt wie groß der Inhalt werden kann?
    Die 100 ist einfach eine Buffergröße die ich verwende wenn ich mir keine Gedanken über die Größe machen möchte.

    Wenn man soviel Gedanken reinsteckt es dynamisch zu erzeugen sollte man überlegen wie groß es maximal werden kann um nicht zu viel Speicher zu verbrauchen.

    Und wenn du es dynamisch machen willst wo ist das zugehörige delete?

    Wenn du aber schon anfängst eigene Sachen in C++ zu lösen, nimm doch die Objektorientierung mit Konstruktoren (Ctor) und Destruktoren (Dtor) direkt mit.



  • was du geschrieben hast scheint er zu mögen aber 1. hat er nen fehler bei char zwecks deklarationssyntax, wenn ich da ne geschweifte klammer setze dann schreit er weiter unten im code rum und 2. mag er szProtokoll nicht. hab nu keine ahnung was er da von mir haben will besser gesagt was ich da machen soll.
    er sagt dann halt immer, undefiniertes symbol 'szProtokoll'. ich weis net, wie ich ihm das definieren soll.

    hab jetzt mal den code im 1. post geuppt, so wie ich ihn jetzt hab.



  • 1. Ich würde void klein schreiben
    2. Da du die Winapi Funktion GetLocalTime(&st) benutzt kannst du deine eigene Funktion nicht genauso nennen.
    3. Bitte schau dir mein Posting vom 28.07 23:10 noch einmal genau an.
    4. Tutorials für C / C++ sind was tolles


Anmelden zum Antworten