1

Konu: Terminaller ile sunucu (server) arasındaki zaman senkronizasyonu

Bir sorunum var. Sunucu işletim sisteminin olmadığı basit bir ağ ortamında (Sadece XP ya da 2000 yüklü PC'ler) sunucu olarak seçilen bir PC ile diğer terminaller arasındaki zaman senkronizasyonunu nasıl yapabilirim? Çünkü bazan pili biten (Real-Time Clock pili) PCler oluyor ve farkedilmiyor onlar açıldıklarında örneğin 1980 ya da 2000 gibi bir yılı gösteriyor.
Sonuç olarak, ihtiyacım olan şey; VFP ile yazılmış bir programı başlatırken zaman senkronizasyonu yapan ve VFP ile yazılabilecek bir kod. Yoksa zeminde çalışarak her daim senkronizasyon yapmasına gerek yok.
Teşekkürler..

2

Re: Terminaller ile sunucu (server) arasındaki zaman senkronizasyonu

anladığım kadarı ile,kullanıcılara serverdeki tarihi kullandırmayı amaçlıyorsun.Aklıma şöyle bir fikir geldi. Serverdeki database sabitler isimli bir tablo aç ve oraya tarih bilgisini sakla.Tarihi belli zaman aralıklarında okuyup update eden küçük bir progam kodu yaz(örneğin tarihupdate.exe).Bu program çalıştırıldığında timer kontrolu ile senin belirlediğin zaman aralığında serverdeki sabitler tablosuna o anki tarihi yazsın.ve bu küçük kod sürekli serverde çalışsın. Tarih bilgisi databasede kayıtlı ve güncel halde artık durduğuna göre,tarih kullanacağın her yerde sabitler.dbf den okuyup kullanabilirsin.Ben buna benzer bişey yapmıştım zamanında işimi görmüştü..

En büyük sermaye nakit,nakit sermaye vakittir...

3

Re: Terminaller ile sunucu (server) arasındaki zaman senkronizasyonu

Ben bunu kullaniyorum (benzeri problem nedeniyle ):

Visual Fox Pro
o = CREATEOBJECT('myApp')

o.DataPath = "\\sunucu\paylasim" && ya da "f:\data" gibi
o.SynchTimeWithServer()
 
Define Class myApp As Custom
    DataPath = '' && bu uygulamanin serverda erisebildigi yazilip okunabilen yol
 
    Procedure GetDBCTime
        * Get time from data server
        Local lcTemp As String, ltNow As Datetime, lnSelect
        Local Array arrFile[1]
        lcTemp = FORCEPATH(sys(2015)+'.tmp', this.Datapath)
        Strtofile('x',m.lcTemp)
        Adir(arrFile,m.lcTemp)
        ltNow = Ctot(Transform(Dtoc(arrFile[3],1),'@R ^9999/99/99')+' '+arrFile[4])
        Erase (m.lcTemp)
        Return m.ltNow
    Endproc
 
    Procedure SynchTimeWithServer
        Local m.ltNow, wYear,wMonth,wDayOfWeek,wDay,wHour,wMinute,wSecond,wMilliseconds
        With This
            m.ltNow = .GetDBCTime()
            If Abs(m.ltNow-Datetime()) < 5 && Do not update if difference is in 5 seconds
                Return
            Endif
            * Set to m.ltNow
            wYear         = Year(m.ltNow)
            wMonth        = Month(m.ltNow)
            wDayOfWeek    = 0 && ignored
            wDay          = Day(m.ltNow)
            wHour         = Hour(m.ltNow)
            wMinute       = Minute(m.ltNow)
            wSecond       = Sec(m.ltNow)
            wMilliseconds = 0
 
            cNewTime = .Num2Word(wYear)+;
                .Num2Word(wMonth)+;
                .Num2Word(wDayOfWeek)+;
                .Num2Word(wDay)+;
                .Num2Word(wHour)+;
                .Num2Word(wMinute)+;
                .Num2Word(wSecond)+;
                .Num2Word(wMilliseconds)
        Endwith
 
        Declare Integer SetLocalTime In win32api String @ lpTime
 
        * Intentionally call twice - daylight settings might affect
        SetLocalTime(@cNewTime)
        SetLocalTime(@cNewTime)
 
        Clear Dlls 'SetLocalTime'
    Endproc
 
    Procedure Num2Word
        Lparameters tnDecimal
        Return Chr(m.tnDecimal%256)+Chr(Int(m.tnDecimal/256))
    Endproc
Enddefine

4

Re: Terminaller ile sunucu (server) arasındaki zaman senkronizasyonu

Çetin Bey, mükemmel bir kod.
Yanıtlar için teşekkür ederim.
Anladığım kadarıyla terminalin verdiği komutla server'da oluşturulan bir dosyanın tarih ve saati terminalin değil server'ınki oluyor. Bana çok ilginç geldi. Teşekkürler

5

Re: Terminaller ile sunucu (server) arasındaki zaman senkronizasyonu

tam senkronize olmaz. novell bir komutuyla bu işi kendi yapıyordu...

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

6

Re: Terminaller ile sunucu (server) arasındaki zaman senkronizasyonu

Konuyu yeniden gündeme getirmemin nedeni aşağıdaki kod işimi görüyordu. Ancak yaz saati uygulmasıyla zaman senkronizasyonu 1 saat geri kalıyor. Yani sunucuda saat 11:00 ise terminalde 10:00 olarak ayarlanıyor.

Sorun nerede anlayamadım.

Visual Fox Pro
SetSystemDate(serverdate(m.sunucuad))

 
PROCEDURE ServerDate
LPARAMETERS tcServ as String
LOCAL lcOutputBuffer as String, lcServerName as String, lnDayLightSaving as Integer,lnElapsed as Integer,;
lnInputBuffer as Integer, lnResult, ltServer
ltServer=""
DECLARE integer NetRemoteTOD in netapi32 string @, integer @
DECLARE integer RtlMoveMemory in win32api string @, integer, integer
lcOutputBuffer=replicate(chr(0),48)
lnInputBuffer=0
lcServerName=strconv(tcServ,5)+chr(0)
lnResult=NetRemoteTOD(@lcServerName,@lnInputBuffer)
IF lnResult=0
   RtlMoveMemory(@lcOutputBuffer,lnInputBuffer,48)
  ELSE
   lcServerName=strconv([\\] + tcServ,5)
   lnResult=NetRemoteTOD(@lcServerName, @lnInputBuffer)
   IF lnResult=0
     RtlMoveMemory(@lcOutputBuffer,lnInputBuffer,48)
   ENDIF
  ENDIF
IF lnResult=0
  lnElapsed=StrToLong(substr(lcOutputBuffer,1,4))
  lnDayLightSaving=GetDaylightSaving()
  ltServer={^1970-01-01 00:00:00}+lnElapsed-(lnDayLightSaving*60)
ENDIF
clear dlls [NetRemoteTOD]
clear dlls [RtlMoveMemory]
RETURN ltServer
PROCEDURE GetDaylightSaving
declare integer GetTimeZoneInformation in kernel32 string @lpTimeZoneInformation
lcTimeZone=replicate(chr(0),172)
lnId=GetTimeZoneInformation(@lcTimeZone)
lnBias=StrToDWord(substr(lcTimeZone,1,4))
clear dlls [GetTimeZoneInformation]
RETURN lnBias
PROCEDURE StrToDWord
LPARAMETERS tcDWord as String
lnRetVal=asc(substr(tcDWord,1,1))+bitlshift(asc(substr(tcDWord,2,1)),8);
  +bitlshift(asc(substr(tcDWord,3,1)),16)+bitlshift(asc(substr(tcDWord,4,1)),24)
RETURN lnRetVal
PROCEDURE StrToLong
lparameters tcLS
LOCAL lcString as String, lnRetVal as Integer, lnI as Integer
lcString=tcLS
lnRetVal=0
FOR m.lnI=0 to 24 step 8
  lnRetVal=m.lnRetVal+(asc(m.lcString)*(2^m.lnI))
  lcString=substr(m.lcString,2)
NEXT
RETURN lnRetVal
Function SetSystemDate
  Lparameters tdDate
  Declare Integer SetLocalTime In win32api String @ lpTime
  Local lcNewTime
  lcNewTime=Num2Word(Year(m.tdDate))+Num2Word(Month(m.tdDate))+;
  Num2Word(0)+Num2Word(Day(m.tdDate))+Num2Word(hour(m.tdDate))+;
  Num2Word(minute(m.tdDate))+Num2Word(sec(m.tdDate))+Num2Word(0)
  SetLocalTime(@lcNewTime)
  SetLocalTime(@lcNewTime)
EndFunc
Function Num2Word
  Lparameters tnDecimal
  Return Chr(m.tnDecimal%256)+Chr(Int(m.tnDecimal/256))
EndFunc

7

Re: Terminaller ile sunucu (server) arasındaki zaman senkronizasyonu

Ben zaman kontrolünü web den yapıyorum. Kullandığım kod şu şekilde:

Visual Fox Pro
?GetInternetDateTime()

FUNCTION GetInternetDateTime && Author: Cetin BASOZ
 
    LOCAL ldTarih
    url = "http://free.timeanddate.com/clock/i2m2mb7g/n19/tlfi27/fn8/fs12/fc9ff/tc000/tt0/tw0/tm3/td2/th1/tb2"
 
    TRY
        objHTTP = CreateObject("MSXML2.XMLHTTP")
        objHTTP.Open("GET", url,.f.)
        objHTTP.Send()
 
        m.ldTarih = '{^'+STREXTRACT(objHTTP.ResponseText, '<span id=t1>','</span>')+'}'
        IF Empty(m.ldTarih)
            m.ldTarih = '{^'+STREXTRACT(url), '<span id=t1>','</span>')+'}'
        ENDIF
        m.ldTarih = &ldTarih
    CATCH TO LOEXCEPTION
        * m.ldTarih = GetServerTime() && Web sitesine erişim yok. !!! Kendi procedurunu kullan yada hatayı işle!
    FINALLY
    ENDTRY
 
    RETURN (m.ldTarih)
ENDFUNC
Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

8

Re: Terminaller ile sunucu (server) arasındaki zaman senkronizasyonu

teşekkürler.
Sorun şu ki; sistem internete bağlı değil. Virüs v.b. nedeniyle.

9

Re: Terminaller ile sunucu (server) arasındaki zaman senkronizasyonu

Benim yazdigim kod internet gerektirmiyor. Sunucunun saati her ne ise (dogru ya da yanlis) onunla LAN'de senkronize ediyor, Dene istersen.