Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

Как синхронизировать время с сервером точного времени в Интернет?   Найти похожие ветки 

 
kas-t   (2004-03-04 19:41) [0]

Народ, может кто подскажет как можно из Delphi синхронизировать время с удаленным сервером точного времени в Интернете? Желательно конечно пример, или хотя бы направление в какую сторону копать . Зарание огромное спасибо!


 
TButton ©   (2004-03-04 19:47) [1]

счас скажу
приконектиться к серверу на 13й порт и слушать, слушать, слушать...


 
TButton ©   (2004-03-04 19:48) [2]

а ну коннектиться через TCP\IP если это так важно в данном контексте...


 
kas-t   (2004-03-04 21:25) [3]

А как приконнектится? И чем? Можно примерчик?


 
Rouse_ ©   (2004-03-04 22:21) [4]

Ну вообщето насколько я помню на 37-ой порт, а во вторых, может проще через IdTime?


 
Rouse_ ©   (2004-03-04 22:25) [5]

Кстати на DAYTIME (13-й порт) не обязательно устанавливать соединение, можно и по UDP


 
TButton ©   (2004-03-04 22:45) [6]

Удалено модератором
Примечание: Будь другом, не ляпай экспромтом...


 
Карелин Артем ©   (2004-03-05 10:11) [7]

Net time может?


 
Verg ©   (2004-03-05 10:35) [8]

И 13 и 37-ой
Разница в том, что на 13 порту время возвращается в текстовом формате, а с 37-го - 32-х разрядное число - количество секунд, прошедших с 00:00:00 1 января 1900 года (UTC).


 
able ©   (2004-03-05 12:28) [9]

net time??


 
Fredericco ©   (2004-03-05 14:23) [10]


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls,ExtCtrls,  Menus, ScktComp;

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   ClientSocket1: TClientSocket;
   procedure Timer1Timer(Sender: TObject);
   procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
   procedure ClientSocket1Disconnect(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
     ErrorEvent: TErrorEvent; var ErrorCode: Integer);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 DayOfWeek:string;
 Month:string;
 sDayOfMonth:string;
 sTime:string;
 sHour,sMin,sSec:string;
 sYear:string;
 HostOfServ:array[1..2] of string;
 CurrServ:integer=1;

implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 try
   ClientSocket1.Open;
   Timer1.Enabled:=False;
 except
   if CurrServ=1 then CurrServ:=2 Else CurrServ:=1;
   ClientSocket1.Host:=HostOfServ[CurrServ];
 end;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
var
 s:string;
 st:_SYSTEMTIME;
begin
 try
   GetLocalTime(st);
   s:=Socket.ReceiveText;
   s:=Copy(s,1,Length(s)-2);
   {"Fri Aug  1 11:20:53 2003"}

   DayOfWeek:=Copy(s,1,3);
   Month:=Copy(s,4,3);
   sDayOfMonth:=Copy(s,9,2);
   sYear:=Copy(s,21,4);
   sHour:=Copy(s,12,2);
   sMin:=Copy(s,15,2);
   sSec:=Copy(s,18,2);

   st.wHour:=StrToInt(sHour);
   st.wMinute:=StrToInt(sMin);
   st.wSecond:=StrToInt(sSec);
   SetLocalTime(st);
 except
 end;
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 Timer1.Enabled:=True;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
 Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
 var ErrorCode: Integer);
begin
 ErrorCode:=0;
 Socket.Disconnect(Socket.SocketHandle);
 if CurrServ=1 then CurrServ:=2 Else CurrServ:=1;
 ClientSocket1.Host:=HostOfServ[CurrServ];
 Timer1.Enabled:=False;
 Timer1.Enabled:=True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 HostOfServ[1]:="ntp.psn.ru";
 HostOfServ[2]:="sign.chg.ru";
end;

end.


 
kas-t   (2004-03-06 08:40) [11]

Досканально по разбиратся с исходным кодом не успел. Но попробывал его запустить. При запуске спустя указанное время в таймере выскакивает ошибка (я добавил извещение об этом) после чего соеденние больше не происходит. В общем, ни какой информации с серверов не приходит. Я так понимаю порт дожен быть указан 13?


 
TUser ©   (2004-03-06 13:25) [12]

см на delphiworld есть несколько примеров сабжа.


 
Verg ©   (2004-03-06 14:30) [13]

Разберись с тем исходником - "научишь" его работать, то будет плюс к навыкам в асинхронных сокетах.

Вот еще тебе "лабораторная" :) по блокирующим сокетам:

program gettime;

{$APPTYPE CONSOLE}

uses
 Windows,
 WinSock, SysUtils;

function IsIP(const Value: string): Boolean;
var
 n, x: Integer;
begin
 Result := true;
 x := 0;
 for n := 1 to Length(Value) do
   if not (Value[n] in ["0".."9", "."]) then
   begin
     Result := False;
     Break;
   end else
   begin
     if Value[n] = "." then
       Inc(x);
   end;
 if x <> 3 then
   Result := False;
end;

function GetNetTime(const Host : string): string;
const
  EOLN = #10;
  BUFFER_MAX   = 300;
var
 S : TSocket;
 PHst : PHostent;
 Addr : TSockAddrIn;
 Recvd, Rec : integer;
 I : integer;
begin
 Result:="ERROR";
 FillChar(Addr, sizeof(addr), 0);
 Addr.sin_family := AF_INET;
 Addr.sin_port   := htons(13);
 if not IsIp(Host) then
 begin
   PHst := gethostbyname(pchar(Host));
   if PHst = nil then
     exit;
   Addr.sin_addr.S_addr :=  PInteger(PHst^.h_addr^)^;
 end else
   Addr.sin_addr.S_addr := inet_addr(pchar(Host));
 S := socket(PF_INET, SOCK_STREAM,0);
 if S<>INVALID_SOCKET then
 try
   if connect(S, Addr, sizeof(Addr)) = SOCKET_ERROR then
     exit;
   SetLength(Result, BUFFER_MAX);
   Recvd := 0;
   try
     repeat
       Rec := recv(S, result[Recvd+1], length(Result) - Recvd, 0);
       if Rec <= 0 then
         exit;
       Recvd := Recvd + Rec;
       I := Pos(EOLN, Result);
       if (I > 0) and (I <= Recvd) then
         Exit;
       if Recvd = length(Result) then
         exit;
     until false;
   finally
     SetLength(Result, Recvd);
     Result := trim(Result);
   end;
 finally
   closesocket(S);
 end;
end;

var
 WSAData : TWSAData;

begin
 if WSAStartup(MAkeWord(1,1), WSAData) = 0 then
 try
   Writeln(GetNetTime("ntp.psn.ru"));
 finally
   WSACleanup;
 end else
   Writeln("Ошибка инициализации WinSock");
 ReadLn;
end.



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.044 c
3-1081336377
sergg
2004-04-07 15:12
2004.05.02
Как уменьшить ширину столбцов в DBGride?


8-1075737379
Igoryok
2004-02-02 18:56
2004.05.02
Замкнутую область зарисовать


4-1078857378
Tofig Gasanov
2004-03-09 21:36
2004.05.02
Нестандартные окна..


1-1081851992
siriusP
2004-04-13 14:26
2004.05.02
Свойство типа объект в инспекторе объектов?


1-1081871997
MAXH0
2004-04-13 19:59
2004.05.02
Кто может скинуть файл dateutils.dcu на мыло?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский