En delphi con Indy tiene cuatro protocolos distintos para hacerlo de una manera mucho mas sencilla y ademas te sincroniza la hora con el PC.
Os pongo un ejemplo de dos de ellos con TidTimeUDP y TidSNTP:
Código Delphi
[-]unit main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdSNTP, IdBaseComponent, IdComponent,
IdUDPBase, IdUDPClient, IdTimeUDP, Vcl.StdCtrls;
type
TForm5 = class(TForm)
btnRespuesta: TButton;
edProtocoloSNTP: TEdit;
edHoraPTime: TEdit;
procedure btnRespuestaClick(Sender: TObject);
private
public
function obtenerFechaHoraProtocoloTiempo( server: string; sincronizarHora: Boolean = False ): TDateTime;
function obtenerFechaHoraProtocoloSNTP( server: string; sincronizarHora: Boolean = False ): TDateTime;
end;
var
Form5: TForm5;
implementation
{$R *.dfm}
procedure TForm5.btnRespuestaClick(Sender: TObject);
begin
edHoraPTime.Text := DateTimeToStr( obtenerFechaHoraProtocoloTiempo( 'hora.roa.es', True ) );
edProtocoloSNTP.Text := DateTimeToStr( obtenerFechaHoraProtocoloSNTP( 'hora.roa.es' ) );
end;
function TForm5.obtenerFechaHoraProtocoloSNTP(server: string; sincronizarHora: Boolean ): TDateTime;
var
serverSNTP: TIdSNTP;
begin
serverSNTP := TIdSNTP.Create( Self );
serverSNTP.Host := server;
Result := serverSNTP.DateTime;
if ( sincronizarHora ) then
serverSNTP.SyncTime;
serverSNTP.Free;
end;
function TForm5.obtenerFechaHoraProtocoloTiempo(server: string; sincronizarHora: Boolean ): TDateTime;
var
serverITimeUDP: TIdTimeUDP;
begin
serverITimeUDP := TIdTimeUDP.Create( Self );
serverITimeUDP.Host := server;
Result:= serverITimeUDP.DateTime;
if ( sincronizarHora ) then
serverITimeUDP.SyncTime;
serverITimeUDP.Free
end;
end.