SNTP Protocol (port 37) - Probleme mit Variablen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Charlie
Beiträge: 6
Registriert: 08.02.2005 22:41

SNTP Protocol (port 37) - Probleme mit Variablen

Beitrag von Charlie »

hallo erstmal,

eigentlich ist es ja ganz simple. ich verstehe nur nicht wo die variable limit in purebasic liegt.

habe vor einige tagen angefangen purebasic zu lernen. klappt ja eigentlich ganz gut, einige kleine projekte lassen sich umschreiben auf purebasic und bin immer wieder überrascht wie einfach das ist.
doch irgendwie klappt es nicht, wenn ich versuche die daten von zeitserver in unix timestamp um zu konvertieren

Code: Alles auswählen

Procedure GetINetTime()
  Protected sHex.s
  Protected TimeValue.f
  
  #SNTPHost = "ntp1.fau.de"
  #SNTPPort = 37
  
  If (InitNetwork() = 0)
    ; TCP/IP nicht vorhanden, zurück zum HQ
    ProcedureReturn 1
  EndIf

  ConnectionID = OpenNetworkConnection(#SNTPHost, #SNTPPort)
  If ConnectionID
    ; verbindung timeout in 30sekunden
    TimeOut = Date() + 30
  Else
    ; Verbindung kann nicht hergestellt werden
    ; versuchen wir später nochmal, aber erstmal zurück
    ProcedureReturn 2
  EndIf
  
  sData = AllocateMemory(100)
  Repeat
    CloseConnection = NetworkClientEvent(ConnectionID)
    Select CloseConnection
      Case 2
        ReceiveNetworkData(ConnectionID, sData, 100)
        sHex = Bin2Hex(PeekS(sData))
        TimeValue = Hex2Dec("7FFFFFFF") - Hex2Dec(sHex) - Hex2Dec("7FFFFFFF")
        TimeValue = Abs(TimeValue)
        Debug TimeValue
        Timestamp = TimeValue - 2208988800
        Debug Timestamp
        CloseConnection = 1
      Default
        If (Date() >= TimeOut)
          CloseConnection = 1
        EndIf
    EndSelect
    Delay(1)
  Until CloseConnection = 1
  FreeMemory(sData)
  CloseNetworkConnection(ConnectionID)
  ProcedureReturn 0
EndProcedure
weder 'Protected Timestamp.l' oder 'Protected Timestamp.f' gibt ein zufriedene ergebniss ab.
kann mir mal jemand ein tip geben?

oder ist das 'features' von PureBasic? Denn in andere Programmiersprache funktioniert ja tadellos
Team100
Beiträge: 104
Registriert: 13.09.2004 22:59

Beitrag von Team100 »

.... Longs in Purebasic können Werte von -2147483648 bis +2147483647
annehmen, wird das Limit überschritten wird das Vorzeichen umgekehrt
und auch die Zählrichtung gewechselt. Beim Ausrechnen des Timestamps
werden diese Wertegrenzen überschritten.

Purebasic kennt derzeit noch keine doubles. (Erst ab der bald?? erscheinenden Version 4.0 ....)

Abhilfe: Die F64 Userlib verwenden (siehe PureArea.net ) oder die
Longs (rechtzeitig) zerlegen, die Teilbeträge errechnen und das Ergebnis
als String darstellen.

Da die Funktionen Bin2Hex etc. nicht angegeben sind (und auch auf die
Schnelle nicht zu finden sind), fällt das Austesten natürlich schwer.....

Cu von Team100
Kompliziert kann es jeder lösen, aber das wirklich Geniale ist einfach.....
Charlie
Beiträge: 6
Registriert: 08.02.2005 22:41

Beitrag von Charlie »

die funktion Bin2Hex bzw. Hex2Dec habe ich von PHP abgeguckt und hab es dann in PureBasic umgesetzt da es (noch) nicht gibt.

Code: Alles auswählen

Procedure.s Bin2Hex(strBin.s)
  Protected i.b
  Protected strHex.s
  Protected lenBin.b
  lenBin = Len(strBin)
  For i = 1 To lenBin
    strHex = strHex + Hex(Asc(Mid(strBin, i, 1)))
  Next i
  ProcedureReturn strHex
EndProcedure

Procedure.f Hex2Dec(strHex.s)
  Protected i.b
  Protected floatDec.f
  Protected lenHex.b
  lenHex = Len(strHex)
  strHex = UCase(strHex)
  For i = 1 To lenHex
    floatDec = floatDec + (FindString("0123456789ABCDEF", Mid(strHex, i, 1), 1) - 1) * Pow(16, lenHex - i)
  Next i
  ProcedureReturn floatDec
EndProcedure
seltsam finde ich allerding das PureBasic

Code: Alles auswählen

Timestamp = TimeValue - 2208988800
die zwei Zahlen addiert anstatt sie zu subtrahiert, wenn ich Timestamp als float deklariere :?:
Antworten