最近我用C语言写了一个连接授时服务器获取网络时间的小程序,但是运行的时候会显示下面提示。
“由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败”
已经换了好几个授时服务器了,但都是这个问题,而且我也都提前ping过了,都通的。
程序本身应该没问题,我试着连过网易的SMTP服务器,能连上。 
   请问 各位网络编程高手,是否有这方面的经验,告诉我一个好的解决方法啊,如果这个问题没有解决,那我就无法往下继续学习了啊,谢谢了。

解决方案 »

  1.   

    两个可以用的时间服务器:
    utcnist.colorado.edu(IP:128.138.140.44)
    stdtime.gov.hk(IP:210.0.235.14)1.RFC-867协议:
    同时支持TCP和UDP,使用13号端口。
    连接成功后服务器会立刻发送给你如下的字符串:
    04 MAR 2011 09:13:55 HKT
    不过格式不固定,每个服务器格式都不一样。2.RFC-868协议:
    同时支持TCP和UDP,使用37号端口。
    连接成功后服务器会立刻发送给你一个unsigned long大小的整数,
    该值代表自1900年1月1后的通用时间协调 (UTC) 秒数。
    你可以如下调用:
    unsigned long ulTime;//接收用
    //..接收代码
    ulTime = ntohl(ulTime);//转为本机字节序
    SYSTEMTIME st;
    TCHAR szBuffer[128];
    GetSystemTime(ulTime,&st);//自定义函数见下面
    ParseSystemTime(&st,szBuffer,sizeof(szBuffer)/sizeof(szBuffer[0]));//自定义函数见下面
    cout<<'\n'<<szBuffer<<'\n';//显示时间
    //自定义函数
    #define HIGHTIME 21968699 
    #define LOWTIME  4259332096 
    BOOL GetSystemTime(unsigned long ulTime, SYSTEMTIME * st)//ulTime表示1900.1.1至今的秒数(UTC-based)
    {
    FILETIME LocalFileTime;
    UINT64 uiCurTime, uiBaseTime, uiResult;
    uiBaseTime = ((UINT64) HIGHTIME << 32) + LOWTIME;
    uiCurTime = (UINT64)ulTime * (UINT64)10000000;
    uiResult = uiBaseTime + uiCurTime;
    FileTimeToLocalFileTime((const FILETIME *)&uiResult,&LocalFileTime);
    return FileTimeToSystemTime(&LocalFileTime, st);
    }
    void ParseSystemTime(const SYSTEMTIME * st, LPTSTR szBuffer, size_t len)
    {
    static const TCHAR szWeek[7][10]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
    _sntprintf(szBuffer,len,TEXT("%d-%02d-%02d %02d:%02d:%02d.%03d %s"),
    st->wYear,st->wMonth,st->wDay,
    st->wHour,st->wMinute,st->wSecond,st->wMilliseconds,szWeek[st->wDayOfWeek]);
    if(len)
    szBuffer[len-1] = '\0';
    }
    3.其他几个时间协议略..
    参考链接:
    http://joyssue.blog.51cto.com/95711/316125
      

  2.   

    利用RFC868协议编写网络对时程序