プロが教えるわが家の防犯対策術!

VC++にてNTPサーバから時刻を取得するためにNetRemoteTODを用いていますが、以下の方法ではコンパイルはできるのですが、プログラム実行時にサーバにつながらなくエラーとなります。サーバの指定方法がまずい気もするのですが、どのように修正すればよいのかご教授よろしくお願いします。

LPTIME_OF_DAY_INFO pBuf = NULL;
NET_API_STATUS nStatus = NetRemoteTOD(L"\\\\ntp.jst.mfeed.ad.jp", (LPBYTE *)&pBuf);
if(nStatus == NERR_Success){
if(pBuf != NULL){
char d[1024];
sprintf(d, "%d/%d/%d %d:%d:%d", pBuf->tod_month, pBuf->tod_day, pBuf->tod_year, pBuf->tod_hours, pBuf->tod_mins, pBuf->tod_secs);
AfxMessageBox(d,MB_OK|MB_ICONSTOP);
}
}
else{
AfxMessageBox("Error in NetRemoteTOD",MB_OK|MB_ICONSTOP);
}
if (pBuf != NULL) NetApiBufferFree(pBuf);

A 回答 (2件)

>どのように時刻を取得できるでしょうか。



APIで一発。
というワケには行かないんじゃないですかねぇ…。
・自前でNTPかSNTPプロトコルを実装する。
・外部のNTP/SNTPクライアントを子プロセスで起動して結果から取得(または同期後にローカルタイムを取得)。
のどちらかになるかと。

自前で実装するならNTPよりはSNTPの方が簡単かと思われます。
# Simpleっていうくらいだし。
RFCなどで確認…でしょうかねぇ。
http://ja.wikipedia.org/wiki/Network_Time_Protocol
http://ja.wikipedia.org/wiki/Simple_Network_Time …
# 後者はRFCの番号の確認くらいしかできませんな。
「Windows SNTP サンプル」で検索してみると、他の方が実装してみたサンプルとか見つかるかも知れません。
http://www2.ocn.ne.jp/~honeybee/program/sample/G …
とか。

外部のクライアントの方も環境が許せばw32tm.exeが使えますかねぇ。
# オプション指定いくつか試したけど…無理かなぁ。
# /resyncで同期して、ローカルタイム取得ですかな。
    • good
    • 0
この回答へのお礼

ありがとうございます。
http://www2.ocn.ne.jp/~honeybee/program/sample/G …
のサンプルでうまく動作しました!

お礼日時:2013/10/16 11:44

NetRemoteTOD()はNTP(SNTP)で時刻を取得するのではなく、NetBIOSとかのWindowsネットワークのプロトコルで時刻を取得するモノかと。



nStatusにエラーコードが返されているでしょうからそちらも調べてみた方が良いかと。
# 2184が返されて、ErrorLookupでは「サービスが開始していません。」となりましたけどね。
手元のsambaが動作しているLinuxサーバ(ntpも稼働)では取れましたが、sambaがヨロシク応答してくれたモノと思われます。
# さすがにsamba止めてまで確認していないが。

この回答への補足

ありがとうございます。
NetRemoteTOD()でないとすると、どのように時刻を取得できるでしょうか。使用しているパソコンでなく、外部の実際の時刻、日付を取得したいと考えています。

補足日時:2013/10/16 08:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!