Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Zeit vom Zeitserver holen (https://www.delphipraxis.net/112498-zeit-vom-zeitserver-holen.html)

Luckie 22. Apr 2008 13:49


Zeit vom Zeitserver holen
 
Ich benutze folgende Funktion, um mir die Zeit von einem Zeitserver zu holen:

Delphi-Quellcode:
function GetINetTime(p: Pointer): Integer;
var
  szBuffer: array[0..255] of Char;
  dwResult: DWORD;
  hostent: PHostEnt;
  sckt: TSocket;
  saddr: TSockAddr;
  res: integer;
  i: Cardinal;
  s: string;
  sStatus: string;
  bOnline: Boolean;
begin
  result := 0;
  SetDlgItemText(hApp, IDC_STCSRVRDATE, nil);
  SetDlgItemText(hApp, IDC_SRVRTIME, nil);
  bOnline := InternetGetConnectedState(@dwResult, 0);
  while bOnline do
  begin
    EnableWindow(GetDlgItem(hApp, IDC_BTNCORRECT), bOnline);
    if bOnline = FALSE then
    begin
      sStatus := 'nicht verbunden';
      SendDlgItemMessage(hApp, IDC_STATBAR, SB_SETTEXT, 0, Integer(@sStatus[1]));
      break;
    end;
    sStatus := 'verbunden';
    SendDlgItemMessage(hApp, IDC_STATBAR, SB_SETTEXT, 0, Integer(@sStatus[1]));
    SendDlgItemMessage(hApp, IDC_CBSERVER, CB_GETLBTEXT, 0, Integer(@szBuffer));
    hostent := gethostbyname(szBuffer);
    if hostent = nil then exit;

    sckt := socket(PF_INET, SOCK_STREAM, 0);
    if (sckt <> INVALID_SOCKET) and (hostent <> nil) then
    begin
      ZeroMemory(@saddr, sizeof(TSockAddr));
      saddr.sin_addr.S_addr := integer(pointer(hostent^.h_addr_list^)^);
      saddr.sin_family := PF_INET;
      saddr.sin_port := htons(37);

      res := connect(sckt, saddr, sizeof(TSockAddr));
      if (res <> SOCKET_ERROR) then
        res := recv(sckt, i, sizeof(i), 0);

      if (res <> SOCKET_ERROR) then
        // Cardinal-Wert "drehen" (host byte order -> TCP/IP network byte order)
        i := htonl(i)
      else
        i := 0;
      EnterCriticalSection(cs);
      ServerTime := i;
      LeaveCriticalSection(cs);
      s := FormatTimeFromInternet(@i);
      SetDlgItemText(hApp, IDC_SRVRTIME, pointer(s));
      s := FormatdateFromInternet(@i);
      SetDlgItemText(hApp, IDC_STCSRVRDATE, pointer(s));

      CloseSocket(sckt);
    end;
    sleep(500);
    bOnline := InternetGetConnectedState(@dwResult, 0);
  end;
end;
Ich weiß, der Code ist grausam, stammt noch aus meiner Jugend.

Jetzt hat mir ein Benutzer meines Programmes eine Mail geschrieben, in der er mich darauf hinwies, dass dies nicht mher funktionieren würde. Und tatsächlich, ich bekomme keine Zeit mehr von den Servern. Der Benutzer meinte noch, dass sich da wohl irgendwelche Ports geändert hätten. Ich habe schon gegooglet, aber nichts gefunden, nur dass wohl auch teilweise Port 123 benutzt wird, aber damit geht es auch nicht.

rollstuhlfahrer 22. Apr 2008 14:11

Re: Zeit vom Zeitserver holen
 
Hi,
versuchs doch einfach mal mit den Indy's, da ist ein Zeitclienbt dabei, der bei mir schon funktioniert hat.

rollstuhlfahrer

Luckie 22. Apr 2008 14:12

Re: Zeit vom Zeitserver holen
 
Danke für den Tipp, aber es handelt sich um ein nonVCL Projekt. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz