利用RFC868协议编写网络对时程序
2010-06-27 20:41:52 来源:WEB开发网MySetTime 函数的功能是将32位值转换为系统时间,并设置系统时间。
void MySetTime(unsigned long ulTime)
{
FILETIME ft;
SYSTEMTIME st;
st.wYear = 1900;
st.wMonth = 1;
st.wDay = 1;
st.wHour = 0;
st.wMinute = 0;
st.wSecond = 0;
st.wMilliseconds = 0;
SystemTimeToFileTime(&st, &ft);
LARGE_INTEGER li = *(LARGE_INTEGER*)&ft;
li.QuadPart += (LONGLONG)10000000 * ulTime;
ft = *(FILETIME*)&li;
FileTimeToSystemTime(&ft, &st);
SetSystemTime(&st);
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//初始化TCP协议
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2), &wsaData)!= 0)
{
MessageBox(NULL, "初始化网络协议失败!", "错误报告", MB_OK|MB_ICONHAND);
return -1;
}
int i = 0;
unsigned long ulTime = 0;
while (sever[i] != NULL)
{
if (GetRemoteTime(sever[i], ulTime))
{
MySetTime(ulTime);
char buff[100];
sprintf(buff, "已成功与时间服务器\r\n%s\r\n的时间同步", sever[i]);
MessageBox(NULL, buff, "成功报告", MB_OK|MB_ICONINFORMATION);
return 0;
}
i++;
}
MessageBox(NULL, "所有服务器均不能正常连接或超时!", "错误报告", MB_OK|MB_ICONHAND);
WSACleanup();
return 0;
}
至于使用UDP协议实现程序详见本文附带的代码。
四、结束语
程序在VC6+WinXP下编写调试正确,并在Win98下运行正确。时间精度本人不敢妄下结论,但经与电视台对时,应小于1秒。也可到国家授时中心上去对时。但通常第一次打开这个网页时服务器时间和本地时间差别大些,多刷新几次又几乎一致了。
本文配套源码
更多精彩
赞助商链接