全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1455
推到 Plurk!
推到 Facebook!

请教使用Socket获取NTP时间的问题

尚未結案
allen-86
一般會員


發表:28
回覆:44
積分:19
註冊:2008-02-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-12-27 13:32:29 IP:114.238.xxx.xxx 訂閱
我参考的是这篇文章:http://www.fetia.cn/2010/07/4728.html
写成Delphi的,Sendto 错误。
请各位大大指点。
unit Unit2;
interface
uses Windows,Winsock2,SysUtils;
type
NTPPACKET=record
li,vn,mode,stratum,poll,precision:uint8;
root_delay,root_dispersion:ulong32;
ref_id:array[0..3] of uint8;
reftimestamphigh,reftimestamplow,oritimestamphigh,
oritimestamplow,recvtimestamphigh,recvtimestamplow,
trantimestamphigh,trantimestamplow:ulong32;
end;

function getntptime:_SYSTEMTIME;
implementation
function getntptime:_SYSTEMTIME;
var
WSAData:TWSAData;
skt:TSocket;
addr:TSockAddrIn;
recbuf:array[0..255] of Char;
n:integer;
ntppack:NTPPACKET;
firsttime:Cardinal;
tt:TDateTime;
begin
WSAStartup($0101,WSAData);
skt:=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if skt<0then
begin
Exit;
end;
ZeroMemory(@ntppack,SizeOf(ntppack));
ntppack.li :=0;
ntppack.vn :=3;
ntppack.mode :=3;
ntppack.stratum :=2;
firsttime:=DateTimeToFileDate(now);
ntppack.oritimestamphigh:=htonl(firsttime);
ZeroMemory(@addr,SizeOf(PSockAddr));
addr.sin_family :=AF_INET;
addr.sin_port:=htons(13);
addr.sin_addr.S_addr:=inet_addr('stdtime.gov.hk');
addr.sin_zero :=#0;
if sendto(skt,ntppack,SizeOf(ntppack),0,@addr,SizeOf(addr))>0 then //这样写对吗?
begin
FillChar(recbuf,sizeof(recbuf),#0);
recv(skt,recbuf,sizeof(recbuf),n);
end;
WSACleanup;
closesocket(skt);
end;
end.

'stdtime.gov.hk' 这个服务器用Indy 的IdDayTime控件试过,用的是13的端口,可以正确取到时间值。
但是查资料好像都说NTP使用的是:123专用端口。


------
The empty vessels make the greatest sound.
系統時間:2017-12-14 2:43:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!