0

インターネットから日付/時刻を取得する例を誰でも挙げることができますが、これまでのところ NetRemoteTOD 関数を使用して情報を見つけただけです。

しかし、ポイントは、サーバー名は何ですか、それを使用する方法がわからないということです。関数で以下のコードを試しましたが、実行時エラーが発生します。

感謝する

LPTIME_OF_DAY_INFO pBuf = NULL;
NET_API_STATUS nStatus;
LPTSTR pszServerName = NULL;
int CurrentYear ;
int CurrentMonth ;
int CurrentDay ;
int CurrentHour;
int CurrentMin;

pszServerName = (LPTSTR) "time.windows.com";
//
// Call the NetRemoteTOD function.
//
nStatus = NetRemoteTOD((LPCWSTR) pszServerName,(LPBYTE *)&pBuf);
//
// If the function succeeds, display the current date and time.
//
if (nStatus == NERR_Success)
{
    if (pBuf != NULL)
    {

        CurrentYear =  pBuf->tod_year;
        CurrentMonth =pBuf->tod_month;
        CurrentDay = pBuf->tod_day;
        CurrentHour=pBuf->tod_hours;
        CurrentMin=pBuf->tod_mins;

    }
}
//
// Otherwise, display a system error.
else
{
    m_SharesEdit[9].SetWindowText("No time");
}
//
// Free the allocated buffer.
//
if (pBuf != NULL)
    NetApiBufferFree(pBuf);


    if( CTime(CurrentYear,CurrentMonth,CurrentDay,CurrentHour,CurrentMin,0) >= CTime(2013,11,25,9,00,00) )
    return true;
else
    return false;
4

1 に答える 1

-1

NetRemoteTODNTP や SNTP などを使用して時刻を読み取るのではなく、Windows サーバーでのみ機能します。実際にはRPCを使用して時間を取得します.ほとんどの人がWindowsサーバーを実行していて、未確認のユーザーがサーバーでRPC呼び出しを行うことを許可しているとは想像できません. .

インターネットから日付/時刻を取得するには (これが本当の意図のようです)、 ではなく NTP または SNTP クライアントを作成または使用する必要がありますNetRemoteTOD。Windows には、w32time サービスの形式の SNTP クライアントが既にあります。その他は、前の質問への回答で言及されています。

コメントに応じて編集: 秒単位の精度などを気にしない可能性があることを考えると、時間を取得するためにRFC 868に従うコードを作成することをお勧めします。秒単位の精度であり、(NTP ができるように) ネットワーク遅延などを補正しようとはしませんが、気にする精度が (おおまかに) 日単位である場合は、おそらく十分すぎるほどです。

実装も非常に簡単です。ポート 37 で UDP 1ソケットを開き、4 バイトのタイムスタンプを読み取ります。これは、おおむね伝統的な Unix フォーマットで与えられます: 1900 年 1 月 1 日の真夜中からの秒数です。


1. TCP ポート 37 も同様に機能しますが、通常は UDP が望ましいです。TCP のオーバーヘッドを正当化するために何もしていません。
于 2013-11-07T18:26:47.110 に答える