Onlinestatus Clientcomputer

Für allgemeine Fragen zur Programmierung mit PureBasic.
texti
Beiträge: 42
Registriert: 13.03.2009 13:24

Onlinestatus Clientcomputer

Beitrag von texti »

Hallo an alle Experten,

zuerst einmal zur Aufgabenstellung: das folgende (Windows-)Programm soll alle 5 Minuten per FTP eine txt-Datei senden, in der der Computername, Datum und Uhrzeit (und weitere Daten) drin stehen. Das funktioniert auch (fast). Auf einigen Client-Computern stürzt das Programm aber unkontrolliert ab und die dazu gehörige txt-Datei hat dann eine Größe von 0 Byte (auch auf dem FTP). Auf anderen Clients gibt es keine Probleme. Die hochgeladenen txt-Dateien werden dann auf dem Server per php ausgewertet.

Nun zu meinen Fragen: Wo könnte der Fehler für die unkontrollierten (und teilweise auch nicht reproduzierbaren) Abstürze liegen? Kann man das Ganze vielleicht (in Pure-Basic) einfacher/besser/intelligenter lösen?

Danke schonmal für Eure Mühe. Hier der Code:

Code: Alles auswählen


ftpadresse$="meineadr.dyndns.com"
ftpuser$="ich"
ftppw$="meins1234"

firma$="meine Firma"


Structure pt
x.l
y.l
EndStructure
Cursor.pt


If CreatePopupMenu(0)
  MenuItem(1, "Über")
  MenuItem(2, "Beenden")
EndIf



If OpenWindow(0, 100, 150, 300, 100, "SysTray Example", #PB_Window_Invisible)
  IconName$ = "useronline.ico"
  AddSysTrayIcon(1, WindowID(0), LoadImage(0, IconName$))
  SysTrayIconToolTip(1, "Online-Status")
  startzeit=Date()
  InitNetwork()
  Repeat
    Event = WaitWindowEvent(100)
    ExitMenu = 0
    If Event = #PB_Event_SysTray
      If EventType()=#PB_EventType_RightClick
        GetCursorPos_(Cursor)
        xPos=Cursor\x
        yPos=Cursor\y
        DisplayPopupMenu(0, WindowID(0), xPos, yPos)
        Repeat
          Select WaitWindowEvent()
          Case #PB_Event_Menu
            Select EventMenu()
            Case 1 ;über
              MessageRequester("System-Status", "System-Status")
              ExitMenu = 1
            Case 2 ;ende
              If MessageRequester("Programm beenden","Möchten Sie das Programm System-Status wirklich beenden?",#PB_MessageRequester_YesNo)=#PB_MessageRequester_Yes
                End
              EndIf
              ExitMenu = 1
            EndSelect
          Case #PB_Event_CloseWindow
            ExitMenu = 1
          EndSelect
        Until ExitMenu = 1
      EndIf
    EndIf
    If startzeit+300<Date()   ;300 sekunden = 5 minuten
      If ExamineEnvironmentVariables()
        While NextEnvironmentVariable()
          If EnvironmentVariableName() = "COMPUTERNAME"
            computername$ = EnvironmentVariableValue()
          EndIf  
        Wend
      EndIf
      ftpdatei$=""
      For x=1 To Len(computername$)
        If (Asc(Mid(computername$,x,1))>47 And Asc(Mid(computername$,x,1))<58) Or (Asc(Mid(computername$,x,1))>64 And Asc(Mid(computername$,x,1))<91) Or (Asc(Mid(computername$,x,1))>96 And Asc(Mid(computername$,x,1))<123)
          ftpdatei$=ftpdatei$+Mid(computername$,x,1)
        EndIf
      Next
      ftpdatei$=LCase(Left(firma$,4)+ftpdatei$)+".txt"
      meineip$="123.456.789.123"
      meindatum$=FormatDate("%dd.%mm.%yyyy",Date())
      meinezeit$=FormatDate("%hh:%ii:%ss",Date())
      If CreateFile(0, ftpdatei$)
        WriteString(0,computername$+";"+meineip$+";"+meindatum$+";"+meinezeit$+";"+firma$,#PB_Ascii)
        CloseFile(0)
        If OpenFTP(0, ftpadresse$, ftpuser$, ftppw$)
          Result = SendFTPFile(0, ftpdatei$, ftpdatei$, 1)
        CloseFTP(0)
        EndIf
      EndIf  
      startzeit=Date()
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf

Nachtrag: Auf einem Client, auf dem ein FTP-Server (nicht der Empfänger für diese Datei) läuft, kommt der Fehler etwas häufiger vor, ist aber auch nicht reproduzierbar. Ach ja, Version ist PB5

danke und Gruß
Nichts wissen macht nichts. Man muß nur wissen, wo es steht, oder wen man fragen kann . . .
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Onlinestatus Clientcomputer

Beitrag von bobobo »

Du sendest FTP asynchron und wertest den Fortschritt nicht aus.
Das führt bei einem frühzeitinge Schliessen des Fensters und damit der ProgrammBeendingung zu einem Abbruch
des Uploads und damit vermutlich zu den leeren Dateien.

Siehe mal in der PB Hilfe bei SendFTp
da gibt es auch Hinweise wie man den FTPFortschritt "beobachten" kann mit FTPProgress(..)
und den entsprechenden Meldungen.

Oder (die schlechte Lösung) Du sendest synchron, (die 1 weglassen) und das Programm wartet im Fehlerfall
auf eventuelle Timeouts (oder auch nicht)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
texti
Beiträge: 42
Registriert: 13.03.2009 13:24

Re: Onlinestatus Clientcomputer

Beitrag von texti »

Danke schonmal für den Tip mit dem asynchronen Senden! Gibt es eine einfache Möglichkeit, beim synchronen senden einen Timeout (etwa 10 Sekunden) einzubauen? Das Programm soll ja weiterlaufen und nicht von Fehlern abgebrochen werden.

gruß

texti
Nichts wissen macht nichts. Man muß nur wissen, wo es steht, oder wen man fragen kann . . .
texti
Beiträge: 42
Registriert: 13.03.2009 13:24

Re: Onlinestatus Clientcomputer

Beitrag von texti »

Danke nochmal für den Tip. Es scheint wirklich daran gelegen zu haben. Sind jemandem noch weitere mögliche Fehlerquellen aufgefallen? Wie gesagt, das Programm soll möglichst auch bei Fehlern weiterlaufen.

Danke und Gruß

texti
Nichts wissen macht nichts. Man muß nur wissen, wo es steht, oder wen man fragen kann . . .
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Onlinestatus Clientcomputer

Beitrag von bobobo »

mach das mal lieber asynchron und werte den FTPProgress aus.
Ein automatischer Timeout ist blöd, hast Du ja schon selber erkannt

in etwas so (ist aus einem bisher ohne Probleme laufendem Programm gecodet vor Urzeiten)

Code: Alles auswählen

...
..
SendFTPFile(#ftp, localfile.s, remotefile.s, 1)
ftpprogress.l = FTPProgress(#ftp) ;ftpprogress abfragen
ftp_what.s = "ftp "
SetGadgetText(#info, ftp_what.s + " " + Str(ftpprogress)) ; Ausgabe auf einem textGadget oder sowas
While ftpprogress
  ftp_what.s = "ftp > "
  Select ftpprogress
    Case #PB_FTP_Started
      ftp_what.s = "ftp init"
    Case #PB_FTP_Finished
      ftp_what.s = "ftp abgeschlosssen"
    Case #PB_FTP_Error
      ftp_what = "FTP ERROR"
  EndSelect
  SetGadgetText(#info, ftp_what.s + " " + Str(ftpprogress))
  delay(250); ne kurze Pause
  ftpprogress.l = FTPProgress(#ftp) ;ftpprogress neu abfragen
Wend
SetGadgetText(#info, "ftp versand abgeschlossen")
..
..
..
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
texti
Beiträge: 42
Registriert: 13.03.2009 13:24

Re: Onlinestatus Clientcomputer

Beitrag von texti »

Werde es asynchron mit FTPProgress(#ftp) machen. Reicht da nicht einfach:

Code: Alles auswählen

...
If OpenFTP(0, ftpadresse$, ftpuser$, ftppw$)
    Result = SendFTPFile(0, ftpdatei$, ftpdatei$, 1)
    While FTPProgress(0)
        delay(100)
    wend
    CloseFTP(0)
endif
...
Oder baue ich damit wieder Fehler ein?
Nichts wissen macht nichts. Man muß nur wissen, wo es steht, oder wen man fragen kann . . .
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Onlinestatus Clientcomputer

Beitrag von helpy »

Bei FTPProgress solltest Du den Rückgabewert entsprechend auswerten.
Mit Deiner While-Schleife bekommst Du sicher nicht das gewünschte Ergebnis!

==> siehe: http://www.purebasic.com/german/documen ... gress.html
Windows 10
PB Last Final / (Sometimes testing Beta versions)
texti
Beiträge: 42
Registriert: 13.03.2009 13:24

Re: Onlinestatus Clientcomputer

Beitrag von texti »

Danke schonmal für die Tips. Habe sie umgesetzt und läuft wunderbar. Nun wäre noch eine automatische Update-Funktion für das Programm schön (schon allein wegen den Änderungen durch eure Tips). Ich habe schon ein paar Sachen gelesen (http://www.purebasic.fr/german/viewtopi ... 90&start=0 und http://forums.purebasic.com/german/view ... c&start=10), komme damit aber (hoffentlich noch) nicht so ganz klar.

Erst einmal die Frage an die Admins: Sollte ich dafür eine komplett neue Anfrage stellen, oder macht das hier mehr Sinn?

Da das Programm im Systemtray läuft und die Nutzer der Client-Computer eher "unbedarft" sind, sollte das Update ohne Rückfragen von selbst laufen. Ich stelle mir das so vor, daß einmal am Tag (bei durchgehend laufenden Computern), oder wenn das erste Mal nach dem Start (Arbeitsplatz mit nicht durchgehender Nutzung) eine Internet-Verbindung besteht, das Programm auf Updates geprüft wird. Das sollte über eine txt-datei auf dem Strato-Server und der Versions-Nummer im Programm (z.B. "version=141") laufen. Wenn ich die oben genannten Links nehme, finde ich nicht alles, wie das umsetzen kann (kann auch an mir liegen; wie gesagt, verstehe den code nicht ganz). Dann müßte wohl das Update geladen werden, das eigentliche Prg geschlossen werden, das Update-Prg macht seine Arbeit und das eigentliche (neue) Programm wieder gestartet werden. Könnt Ihr mir da helfen?

Hoffe, ich konnte mich einigermaßen verständlich ausdrücken.

gruß texti
Nichts wissen macht nichts. Man muß nur wissen, wo es steht, oder wen man fragen kann . . .
Benutzeravatar
HeX0R
Beiträge: 3070
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Onlinestatus Clientcomputer

Beitrag von HeX0R »

Schau mal, ob Du damit besser klar kommst (allerdings Win-Only).
texti
Beiträge: 42
Registriert: 13.03.2009 13:24

Re: Onlinestatus Clientcomputer

Beitrag von texti »

Danke HeXOR. Konnte mir dort alles Nötige rausziehen, was ich brauche. Ist immer wieder schön, wie gut einem hier geholfen wird.

Gruß

texti
Nichts wissen macht nichts. Man muß nur wissen, wo es steht, oder wen man fragen kann . . .
Antworten