サーバーから時刻の取得


ss  2007-09-27 08:31:05  No: 27864

NTPを使用しないで、他のマシン(サーバー)から時刻を
取得(DOSコマンドのNET  TIMEのような)できないでしょうか?


通りすがり  2007-09-27 21:35:45  No: 27865

レスが付かないようですので...

もし、http関連のコンポーネントや関数等が利用できれば以下の
http/GETリクエストでサーバーアクセス時間が取れると思います。

【送信】
GET / HTTP/1.0\r\nHost: www.hogehoge.com\r\n\r\n

【受信例】
HTTP/1.1 200 OK Date: Thu, 27 Sep 2007 03:25:11 GMT Server: Apache/2.0.59 (Win32) PHP/5.2.0 X-Powered-By: PHP/5.2.0 Connection: close Content-Type: text/html 

サーバーなどの環境で表示内容は変わりますので注意。
(この日時はあまり利用した事がないので、詳細は未調査です)


通りすがり  2007-09-27 21:41:56  No: 27866

補足..
サーバーが、LANの共有サーバーだったら、上では無理です。
(WEBサーバーの場合ですね)


古ぅ  2007-10-09 17:00:32  No: 27867

真琴:「ハルコさん、どうしてもウマクいかないんだけど…」
春子:「ン?なにが?」
真琴:「これ…、Edit1に相手のコンピュータ名を入れてボタン押すと、Memo1に時刻が出るはずなのに…」

procedure TForm1.Button1Click(Sender: TObject);
const
  BUFFER_SIZE = $1000;
var
  hReadPipe, hWritePipe: THandle;
  SA: TSecurityAttributes;
  SD: TSecurityDescriptor;
  SI: TStartupInfo;
  PI: TProcessInformation;
  dwStdOut, dwRet: DWORD;
  aBuffer: array[0..BUFFER_SIZE] of Byte;
  sCmd: string;
  msStdOut: TStream;
begin
  SetLength(sCmd, 300);
  ZeroMemory(@SA, Sizeof(TSecurityAttributes));
  with SA do begin
   nLength := Sizeof(TSecurityAttributes);
   bInheritHandle := True;
   if Win32Platform = VER_PLATFORM_WIN32_NT then begin
    InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(@SD, True, nil, False);
    lpSecurityDescriptor := @SD;
    GetSystemDirectory(PChar(sCmd), 255);
    sCmd := PChar(sCmd) +'\Cmd.exe /C NET TIME \\'+ Edit1.Text;
   end else begin
    lpSecurityDescriptor := nil;
    GetWindowsDirectory(PChar(sCmd), 255);
    sCmd := PChar(sCmd) +'\Command.com /C NET TIME \\'+ Edit1.Text;
   end;
  end;
  msStdOut := TMemoryStream.Create;
  CreatePipe(hReadPipe, hWritePipe, @SA, BUFFER_SIZE);
  try
   ZeroMemory(@SI, Sizeof(TStartupInfo));
   with SI do begin
    cb := Sizeof(TStartupInfo);
    dwFlags := STARTF_USESTDHANDLES;
    wShowWindow := SW_HIDE;
    hStdOutput := hWritePipe;
   end;
   Application.ProcessMessages;
   if CreateProcess(nil, PChar(sCmd), @SA, nil, True, DETACHED_PROCESS,
                    nil, nil, SI, PI) then begin
    try
     repeat
      dwRet := WaitForSingleObject(PI.hProcess, 100);
      PeekNamedPipe(hReadPipe, nil, 0, nil, @dwStdOut, nil);
      if (dwStdOut > 0) then begin
       ReadFile(hReadPipe, aBuffer, dwStdOut, dwStdOut, nil);
       msStdOut.Write(aBuffer, dwStdOut);
      end;
     until (dwRet = WAIT_OBJECT_0);
     GetExitCodeProcess(PI.hProcess, dwRet);
    finally
     CloseHandle(PI.hProcess);
     CloseHandle(PI.hThread);
    end;
   end else raise Exception.Create('CreateProcess 失敗!');
   msStdOut.Position := 0;
   Memo1.Lines.LoadFromStream(msStdOut);
  finally
   CloseHandle(hReadPipe);
   CloseHandle(hWritePipe);
   msStdOut.Free;
  end;
end;

春子:「ン?…あ〜ぁ、ナルホド、"NET TIME"コマンドをDelphiのプログラムで実行するのネ」
真琴:「そうなの、アタシのパソコンでコレ実行した場合は、こっちのWinXPパソコンの時刻が見れるんだけど…」
春子:「マコトの部屋のパソコンは、OS、ナニ?」
真琴:「まだ、Win98…」
春子:「古ぅ〜」
真琴:「そう、おじいちゃんが前に使ってた、お古のパソコン。…だけど、形見と思って大切にしてるの」
春子:「そっか、ゴメンゴメン」
真琴:「Win98ならこの方法で ちゃんとMemo1に相手の時刻が表示されるの、でも…」
春子:「WinXPでこのプログラム実行すると、DOS窓が一瞬出るだけで、Memo1には何も表示されないよね」
真琴:「だけど、XPでもコマンドプロンプトで"NET TIME \\..."を実行するとOKなのに…、なんで?」 
春子:「Win98とWinXPでは、同じNET.EXEでも中身がチョット違うみたいね、だからXPではダメなんだよ」
真琴:「もう、どうしたらイイんだろぅ…XPではムリなの?」
春子:「マコト…、じゃぁ、プログラムのココをこう変えてみたら?」

    ・……
//  sCmd := PChar(sCmd) +'\Cmd.exe /C NET TIME \\'+ Edit1.Text;
    sCmd := PChar(sCmd) +'\Net1.exe TIME \\'+ Edit1.Text;
    ・……

真琴:「あっ、これならMemo1にアタシの部屋のパソコンの時刻が表示されたヨ、でもハルコさん、Net1.exeって…」
春子:「NT系のNet.exeは、Net1.exeを呼び出してるみたいなんだ…それでネ」
真琴:「ふ〜ん、そぅいうことなんだぁ…」
春子:「アタシも そこんトコ詳しくは知らないけどネ」


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加