TimeProtocol/UDP を作るには?

解決


kano  2001-12-19 22:45:01  No: 372  IP: [192.*.*.*]

今、Time Service クライアントを作成しているのですが、
TimeProtocol/UDPでつまずいてしまって困っています。
NMUDPコンポーネントを使いサーバからデータの取得は
できたのですが、受け取ったデータを正しい整数型にキャスト
できずにいます・・・。

どなたかご存知の方がいたら是非ともお知恵をお貸しください!

編集    削除
にしの  2001-12-19 23:59:16  No: 373  IP: [192.*.*.*]

ポート37の、TimeProtocolでしょうか。
1900/01/01 00:00GMTからの秒数を返してきています。
ビッグエンディアンかリトルエンディアンかは、今の環境でテストできないので確認していません。
http://www.chuo-u.ac.jp/doc/rfc/rfc868.txt

編集    削除
奈々氏  2001-12-20 12:33:45  No: 374  IP: [192.*.*.*]

ネットワークのバイトの順序は、ビッグエンディアンです。
複数のバイト整数が最上位ビットから順に転送されます。

インテルCPU(Windows)は、リトルエンディアン。

たとえホスト側がビッグ、リトルどちらであっても、
ntohl関数で、ホストの形式に変換できます。これはロング型。
(ショート型ならntohs)

Seconds := (ntohl(NTP_Recv.transmit_timestamp_fractions));

編集    削除
奈々氏  2001-12-20 12:39:59  No: 375  IP: [192.*.*.*]

>Seconds := ntohl(NTP_Recv.transmit_timestamp_fractions);

これは、ミリsecだった。(^^ゞ
秒数は、
seconds := ntohl(NTP_Recv.transmit_timestamp_seconds);

編集    削除
kano  2001-12-25 19:22:54  No: 376  IP: [192.*.*.*]

すみません。返事遅れました・・・。

>ポート37の、TimeProtocolでしょうか。

その通りです。

>ntohl関数で、ホストの形式に変換できます。これはロング型。

ntohl関数ですか。この関数は使った事がないのでよくわからないのですが、
何か特別なuse節を使ったりするのでしょうか?
あと、secondsの型ですけどInt型でもいいんでしょうか?
すみません、よろしくお願いします。

編集    削除
奈々氏  2001-12-26 09:55:57  No: 377  IP: [192.*.*.*]

この手の関数は当然 Winsock.pas で定義されてます。
uses Winsock;
function ntohl(netlong: u_long): u_long; stdcall;

現在の秒数は、16進数で BFD31E2A なので、
符号無し32bit(DWORD、Longword、Cardinal)型がいいのでは?
符号に注意すれば Integer でも問題ないでしょう。

編集    削除
横槍くん  2001-12-26 21:30:03  No: 378  IP: [192.*.*.*]

Delphi3だと"DWORD"は"Integer"と等価になっています。
※Delphi4/5以降はDWORD=Longwordです。

※これは、D3のバグかもしれない?

編集    削除
にしの  2001-12-26 21:50:45  No: 379  IP: [192.*.*.*]

Delphi5のヘルプ(ObjectPascalの)には、

Integer  -2147483648..2147483647  符号付き 32 ビット
Longword  0..4294967295  符号なし 32 ビット
とあります。

たしかDelphi3では、THandleもIntegerになってましたよね。
Delphi5ではLongWordになっています。

編集    削除
kano  2001-12-26 22:59:20  No: 380  IP: [192.*.*.*]

LongWordでntohl関数を使い無事値を出すことができました。
皆様、本当にありがとうございます!
まだ、NTPとSNTPが残っているので先行きは不安ですが、
わからなくなったときは是非ともまたご協力お願いします!

編集    削除