今、Time Service クライアントを作成しているのですが、
TimeProtocol/UDPでつまずいてしまって困っています。
NMUDPコンポーネントを使いサーバからデータの取得は
できたのですが、受け取ったデータを正しい整数型にキャスト
できずにいます・・・。
どなたかご存知の方がいたら是非ともお知恵をお貸しください!
ポート37の、TimeProtocolでしょうか。
1900/01/01 00:00GMTからの秒数を返してきています。
ビッグエンディアンかリトルエンディアンかは、今の環境でテストできないので確認していません。
http://www.chuo-u.ac.jp/doc/rfc/rfc868.txt
ネットワークのバイトの順序は、ビッグエンディアンです。
複数のバイト整数が最上位ビットから順に転送されます。
インテルCPU(Windows)は、リトルエンディアン。
たとえホスト側がビッグ、リトルどちらであっても、
ntohl関数で、ホストの形式に変換できます。これはロング型。
(ショート型ならntohs)
Seconds := (ntohl(NTP_Recv.transmit_timestamp_fractions));
>Seconds := ntohl(NTP_Recv.transmit_timestamp_fractions);
これは、ミリsecだった。(^^ゞ
秒数は、
seconds := ntohl(NTP_Recv.transmit_timestamp_seconds);
すみません。返事遅れました・・・。
>ポート37の、TimeProtocolでしょうか。
その通りです。
>ntohl関数で、ホストの形式に変換できます。これはロング型。
ntohl関数ですか。この関数は使った事がないのでよくわからないのですが、
何か特別なuse節を使ったりするのでしょうか?
あと、secondsの型ですけどInt型でもいいんでしょうか?
すみません、よろしくお願いします。
この手の関数は当然 Winsock.pas で定義されてます。
uses Winsock;
function ntohl(netlong: u_long): u_long; stdcall;
現在の秒数は、16進数で BFD31E2A なので、
符号無し32bit(DWORD、Longword、Cardinal)型がいいのでは?
符号に注意すれば Integer でも問題ないでしょう。
Delphi3だと"DWORD"は"Integer"と等価になっています。
※Delphi4/5以降はDWORD=Longwordです。
※これは、D3のバグかもしれない?
Delphi5のヘルプ(ObjectPascalの)には、
Integer -2147483648..2147483647 符号付き 32 ビット
Longword 0..4294967295 符号なし 32 ビット
とあります。
たしかDelphi3では、THandleもIntegerになってましたよね。
Delphi5ではLongWordになっています。
LongWordでntohl関数を使い無事値を出すことができました。
皆様、本当にありがとうございます!
まだ、NTPとSNTPが残っているので先行きは不安ですが、
わからなくなったときは是非ともまたご協力お願いします!
ツイート | ![]() |