Seite 1 von 1

Onlinestatus Clientcomputer

Verfasst: 20.03.2013 00:37
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ß

Re: Onlinestatus Clientcomputer

Verfasst: 20.03.2013 14:09
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)

Re: Onlinestatus Clientcomputer

Verfasst: 20.03.2013 15:06
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

Re: Onlinestatus Clientcomputer

Verfasst: 21.03.2013 13:03
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

Re: Onlinestatus Clientcomputer

Verfasst: 21.03.2013 14:24
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")
..
..
..

Re: Onlinestatus Clientcomputer

Verfasst: 22.03.2013 11:55
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?

Re: Onlinestatus Clientcomputer

Verfasst: 22.03.2013 12:48
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

Re: Onlinestatus Clientcomputer

Verfasst: 29.03.2013 02:28
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

Re: Onlinestatus Clientcomputer

Verfasst: 29.03.2013 11:23
von HeX0R
Schau mal, ob Du damit besser klar kommst (allerdings Win-Only).

Re: Onlinestatus Clientcomputer

Verfasst: 04.04.2013 09:24
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