阅读RFC868

2009年5月4日星期一

阅读RFC868

 


阅读协议:Time Protocol时间协议


协议地址:http://www.faqs.org/rfcs/rfc868.html,英文


Time Protocol时间协议(此描述来源于http://www.csna.cn/)

  该协议提供了一个独立于站点的,机器可读的日期和时间信息。时间服务返回的是

以秒数,是从1900年1月1日午夜到现在的秒数。设计这个协议的一个重要目的在于,网

络上的许多主机并没有时间的观念,在分布式的系统上,我们可以想一想,北京的时间

和东京的时间如何分呢?主机的时间往往可以人为改变,而且因为机器时钟内的误差而

变得不一致,因此需要使用时间服务器通过选举方式得到网络时间,让服务器有一个准

确的时间观念。不要小看时间,这对于一些以时间为标准的分布运行的程序简单是太重

要了。这个协议可以工作在TCP和UDP协议下。时间是由32位表示的,是自1900年1月1日

0时到当前的秒数,我们可以计算一下,这个协议只能表示到2036年就不能用了,但是

我们也知道计算机发展速度这么快,到时候可能就会有更好的协议代替这个协议。


+++++++++++++++++++++++++++++++++++++++++++++++++++++


根据协议最后一段:


For example:


   the time  2,208,988,800 corresponds to 00:00  1 Jan 1970 GMT,


             2,398,291,200 corresponds to 00:00  1 Jan 1976 GMT,


             2,524,521,600 corresponds to 00:00  1 Jan 1980 GMT,


             2,629,584,000 corresponds to 00:00  1 May 1983 GMT,


        and -1,297,728,000 corresponds to 00:00 17 Nov 1858 GMT.


 


这里我实现下如何得到上述例子的数据2,208,988,800 之类的秒数。


实现平台:winxp+vs2003


语言:c/c++


必要头文件:


#include <iostream>

#include <tchar.h>

#include <windows.h>

#include <stdio.h>


前两个是Console需要的,后两个是自己添加的。


代码如下:(方便拷贝,直接贴码,代码简单就不注释了)


 


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);

}


unsigned long GetLocalSystemTime()

{

 unsigned long ulTime = 0;


 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;


 FILETIME ft_current;

 SYSTEMTIME current;

 GetSystemTime(&current); 

 SystemTimeToFileTime(&current, &ft_current);

 LARGE_INTEGER li_current = *(LARGE_INTEGER*)&ft_current;


 LONGLONG temp = li_current.QuadPart - li.QuadPart;

 temp = temp / 10000000;


 ulTime = (unsigned long)(temp);


 return ulTime;

}


unsigned long GetLocalSystemTime(SYSTEMTIME current)

{

 unsigned long ulTime = 0;


 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;


 FILETIME ft_current;


 SystemTimeToFileTime(&current, &ft_current);

 LARGE_INTEGER li_current = *(LARGE_INTEGER*)&ft_current;


 LONGLONG temp = li_current.QuadPart - li.QuadPart;

 temp = temp / 10000000;


 ulTime = (unsigned long)(temp);


 return ulTime;

}


int _tmain(int argc, _TCHAR* argv[])

{

 unsigned long t = GetLocalSystemTime();

 printf("%u\t\n" ,t);


 SYSTEMTIME current;

 current.wYear = 1970;

 current.wMonth = 1;

 current.wDay = 1;

 current.wHour = 0;

 current.wMinute = 0;

 current.wSecond = 0;

 current.wMilliseconds = 0;


 t = GetLocalSystemTime(current);

 printf("%u\t\n" ,t);


 int into;

 scanf("%d" ,&into);


 return 0;

}


运行结果如下:


 


测试运行结果:2,208,988,800 


 


 


 


 


Tag标签: 协议 RFC 868

0 评论:

发表评论