获取网络时间并刷新本地时间(源码2)
因为上次那个获取网络时间失效了(使用的是37端口),获取网络时间并刷新本地时间(源码1)
所以网上又找了一份代码,使用的是123端口,虽然没有测试成功,这里也做下记录,估计是本机环境问题,过两天再进行测试一下。
// getNTPTime.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"using namespace std;char *GetHostIP(char *strHost)
{ char *strIP = NULL;PHOSTENT hostinfo = gethostbyname(strHost); if(hostinfo != NULL) { strIP = inet_ntoa(*(struct in_addr *)*hostinfo->h_addr_list); } return strIP;
} BOOL SetTimeout(SOCKET s, int nTime, BOOL bRecv)
{ int ret = ::setsockopt(s, SOL_SOCKET, bRecv ? SO_RCVTIMEO : SO_SNDTIMEO, (char *)&nTime, sizeof(nTime)); return ret != SOCKET_ERROR;
} time_t getSNTPTime()
{ WSADATA wsa; WORD wVersionRequested; wVersionRequested = MAKEWORD(2, 0); if (WSAStartup(wVersionRequested , &wsa)!=0) { cerr << "--->>> Winsock Initialization failed." << endl;}time_t t = 0;vector<char *> vecTimeSvr; vecTimeSvr.push_back("ntp1.aliyun.com");vecTimeSvr.push_back("ntp2.aliyun.com");vecTimeSvr.push_back("ntp3.aliyun.com");vecTimeSvr.push_back("ntp4.aliyun.com");vecTimeSvr.push_back("ntp5.aliyun.com");vecTimeSvr.push_back("ntp6.aliyun.com");vecTimeSvr.push_back("ntp7.aliyun.com");/*vecTimeSvr.push_back("cn.pool.ntp.org"); vecTimeSvr.push_back("0.cn.pool.ntp.org"); vecTimeSvr.push_back("1.cn.pool.ntp.org"); vecTimeSvr.push_back("2.cn.pool.ntp.org"); vecTimeSvr.push_back("3.cn.pool.ntp.org"); vecTimeSvr.push_back("time.windows.com"); /* //开放本段,可以在列表中添加更多的NTP服务器vecTimeSvr.push_back("pool.ntp.org"); vecTimeSvr.push_back("north-america.pool.ntp.org"); vecTimeSvr.push_back("south-america.pool.ntp.org"); vecTimeSvr.push_back("africa.pool.ntp.org"); vecTimeSvr.push_back("ca.pool.ntp.org"); vecTimeSvr.push_back("uk.pool.ntp.org"); vecTimeSvr.push_back("us.pool.ntp.org"); vecTimeSvr.push_back("au.pool.ntp.org"); vecTimeSvr.push_back("time.nist.gov"); vecTimeSvr.push_back("time-nw.nist.gov"); vecTimeSvr.push_back("europe.pool.ntp.org"); vecTimeSvr.push_back("asia.pool.ntp.org"); vecTimeSvr.push_back("oceania.pool.ntp.org"); */SYSTEMTIME systime;for(size_t i = 0; i < vecTimeSvr.size(); ++i) { char *strHostName = vecTimeSvr[i]; char *strIP = GetHostIP(strHostName); int SIZE_SOCKADDR_IN = sizeof(SOCKADDR_IN); sockaddr_in SvrIp; SvrIp.sin_family = AF_INET; SvrIp.sin_addr.s_addr = inet_addr(strIP); SvrIp.sin_port = htons(37); int nLenRcv = 0; char szBuff[48] = {'\0'}; szBuff[0] = 3 | (4 << 3); SOCKET sSession = ::socket(AF_INET, SOCK_DGRAM, 0); SetTimeout(sSession, 6000, FALSE); if(SOCKET_ERROR != sendto(sSession, szBuff, 48, 0, (sockaddr*)&SvrIp, SIZE_SOCKADDR_IN)) { SetTimeout(sSession, 6000, TRUE); nLenRcv = recvfrom(sSession, szBuff, 48, 0, (sockaddr*)&SvrIp, &SIZE_SOCKADDR_IN); } else { cerr << "--->>> " << strHostName << ": " << strIP <<endl; cerr << "--->>> send SNTP request failed!" << endl; } closesocket(sSession); if(nLenRcv == 48) { t = 0; for(int i = 40; i <= 43; i++) { unsigned char c = (unsigned char)szBuff[i]; t = (t<<8) | c; } tm _t;t -= 2208988800L; // 1970.1.1 0:0:0 - 1900.1.1 0:0:0 localtime_s(&_t, &t); cerr << "--->>> SNTP's Time - " << (_t.tm_year + 1900) << "-" << (_t.tm_mon + 1) << "-" << (_t.tm_mday) << " " << _t.tm_hour << ":" << _t.tm_min << ":" << _t.tm_sec << endl; cerr << "--->>> " << strHostName << ": " << strIP <<endl; cerr << endl;systime.wYear = _t.tm_year +1900;systime.wMonth = _t.tm_mon + 1;systime.wDay = _t.tm_mday;systime.wHour = _t.tm_hour;systime.wMinute = _t.tm_min;systime.wSecond = _t.tm_sec;systime.wMilliseconds = 0;systime.wDayOfWeek = -1;SetLocalTime(&systime);break;} } if (t == 0){cerr << "--->>> recieve all SNTP's time is failed!" << endl; }return t;
} int _tmain(int argc, _TCHAR* argv[])
{time_t t_1 = getSNTPTime();if (t_1 > 0){char strTime[50];ctime_s(strTime, sizeof(strTime), &t_1);cerr << "--->>> now is " << strTime << endl;}cerr << endl;system("pause");return 0;
}
获取网络时间并刷新本地时间(源码2)相关推荐
- linux c 设置utc时间,C/C++标准库之转换UTC时间到local本地时间详解
前言 UTC 时间DateTime.UtcNow 和 系统本地时间 DateTime.Now 相差8个时区 ,美国本地时间和北京时间相差15个时区: 美国,而一般使用UTC时间方便统一各地区时间差异. ...
- 通过自定义组件学习Vue系列(二)【时间轴】(附源码)
需求: 用于升级日志的显示 效果图: 实现原理: 主要区域分为两块,时间区和内容区,时间区是画一个圆点和显示一个时间,内容区左边一个竖线和文字显示 然后做一下循环,将每个日期的数据显示出来 布局采用f ...
- 易语言修改虚拟机硬盘id_易语言本地虚拟机源码
易语言本地虚拟机源码 系统结构:显示工具路径,读入未用分区,获取分区位置,设置虚拟机分区,读入虚拟分区,操作并显示日志,处理显示错误提示,取驱动器文本列表,写配置目录,处理结果文件,格式化时间,取Do ...
- android flv 编码器,Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载)...
Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载) 项目地址 https://github.com/979451341/RtmpSave 这个项目主要代码 ...
- 获取网关IP和MAC 的VB源码
'窗体上加入控件command1,然后复制下面代码,运行,按command1即可. Option Explicit Private Declare Function OpenProcess Lib & ...
- 生成对抗网络入门详解及TensorFlow源码实现--深度学习笔记
生成对抗网络入门详解及TensorFlow源码实现–深度学习笔记 一.生成对抗网络(GANs) 生成对抗网络是一种生成模型(Generative Model),其背后最基本的思想就是从训练库里获取很多 ...
- NanoPi NEO Air使用七:获取并编译U-boot和Linux的源码
NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...
- 学网络编程很好的参考源码
好的参考资料对我们学习具有意想不到的作用,这个源码简单易懂,而且是面向对象的,对于C++初学者来说,非常容易理解.这里就不作介绍,反正很多人就喜欢看源码.我自己测试过可以通过编译了,源码是FreeEI ...
- 获取Favicon.ico网站图标接口api源码
介绍: 获取Favicon.ico网站图标接口 favicon.ico一般用于作为缩略的网站标志,它显示位于浏览器的地址栏或者在标签上用于显示网站的logo, 目前主要的浏览器都支持favicon.i ...
最新文章
- 洛谷P2252 取石子游戏(威佐夫博弈)
- LOJ#2302 整数
- batch_size 和 fetch_size作用
- OAuth 2.0协议在SAP产品中的应用
- 【MySQL 中 动态sql,游标_】
- TreeView 之间节点拖动 /移动
- 在承德避暑山庄里待过,给你的最大感受是什么?
- linux 发生变更的文件夹,【Linux常识篇(3)】文件及文件夹的ctimeatimemtime的含义详解...
- 牛客网–华为机试在线训练4:字符串分隔
- Javascript算法:非固定宽度滑动窗口算法
- Android调用高德地图服务
- ExtJS 可视化开发工具大全
- 趋势杀毒文件服务器版10用户,趋势杀毒软件(OSCE 10.0)服务器端备份与恢复
- SolidWorks 部分插件不显示
- Python+OpenCV判断图像是黑底还是白底
- 用微软Custom Version识别水果:三分钟开发人工智能小应用
- 【java面对对象】分数类型加减乘除运算的实现
- Zephyr网络协议
- BAT批处理让文件夹里的文件单个或多个依次移动到另外一个文件夹
- Oracle ORA-01017: invalid username/password;解决完一个12560又来一个