C实现一个NTP客户端,可以从指定IP的NTP服务器获取时间戳
参考::https://blog.csdn.net/dosthing/article/details/81588219
下面的代码测试通过
头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <dirent.h>
#include <time.h>
#include <fcntl.h>
#include <errno.h> #define debugprintf 1
#ifdef debugprintf
#define debugpri(mesg, args...) fprintf(stderr, "[NetRate print:%s:%d:] " mesg "\n", __FILE__, __LINE__, ##args)
#else
#define debugpri(mesg, args...)
#endif #define JAN_1970 0x83aa7e80
#define NTPFRAC(x) (4294 * (x) + ((1981 * (x))>>11))
#define USEC(x) (((x) >> 12) - 759 * ((((x) >> 10) + 32768) >> 16))
#define Data(i) ntohl(((unsigned int *)data)[i])
#define LI 0
#define VN 3
#define MODE 3
#define STRATUM 0
#define POLL 4
#define PREC -6 struct NtpTime
{
unsigned int coarse;
unsigned int fine;
}; void sendPacket(int fd);
void getNewTime(unsigned int *data,struct timeval *ptimeval);
double getNtpTime(char * pIP);
源文件
#include "ntp1_so.h"
int main()
{
char myIP[20]="52.175.49.4"; //time.windows.com
double currentTime = getNtpTime(myIP);
printf("currentTime=%f\n",currentTime);
return 0;
}
void sendPacket(int fd)
{
unsigned int data[];
struct timeval now; if (sizeof(data) != )
{
fprintf(stderr,"size error\n");
return;
} memset((char*)data, , sizeof(data));
data[] = htonl((LI << ) | (VN << ) | (MODE << ) | (STRATUM << ) | (POLL << ) | (PREC & 0xff));
data[] = htonl(<<);
data[] = htonl(<<);
gettimeofday(&now, NULL);
data[] = htonl(now.tv_sec + JAN_1970);
data[] = htonl(NTPFRAC(now.tv_usec));
send(fd, data, , );
} void getNewTime(unsigned int *data,struct timeval *ptimeval)
{
struct NtpTime trantime;
trantime.coarse = Data();
trantime.fine = Data(); ptimeval->tv_sec = trantime.coarse - JAN_1970;
ptimeval->tv_usec = USEC(trantime.fine);
} double getNtpTime(char * pIP)
{
int sockfd;
struct sockaddr_in addr_src,addr_dst;
fd_set fds;
int ret;
int recv_len;
unsigned int buf[];
memset(buf,,sizeof(buf));
int addr_len;
int count = ; struct timeval recvtv;
struct timeval *ptimeval;
double offset;
struct timeval timeout; addr_len = sizeof(struct sockaddr_in);
//local
memset(&addr_src, , addr_len);
addr_src.sin_family = AF_INET;
addr_src.sin_addr.s_addr = htonl(INADDR_ANY);
addr_src.sin_port = htons();
//remote
memset(&addr_dst, , addr_len);
addr_dst.sin_family = AF_INET;
addr_dst.sin_addr.s_addr=inet_addr(pIP);
addr_dst.sin_port = htons();//ntp默认端口123 if(-==(sockfd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)))
{
debugpri("create socket error!\n");
return -;
} ret = bind(sockfd, (struct sockaddr*)&addr_src, addr_len);
if(-==ret)
{
debugpri("bind error!\n");
close(sockfd);
return -;
} ret = connect(sockfd, (struct sockaddr*)&addr_dst, addr_len);
if(-==ret)
{
debugpri("connect error!\n");
close(sockfd);
return -;
} sendPacket(sockfd);
while (count < )
{
FD_ZERO(&fds);
FD_SET(sockfd, &fds); timeout.tv_sec = ;
timeout.tv_usec = ;
ret = select(sockfd + , &fds, NULL, NULL, &timeout);
if ( == ret)
{
count++;
debugpri("ret == 0\n");
sendPacket(sockfd);
usleep(*);
continue;
}
if(FD_ISSET(sockfd, &fds))
{
recv_len = recvfrom(sockfd, buf, sizeof(buf), , (struct sockaddr *)&addr_dst, (socklen_t*)&addr_len);
if(-==recv_len)
{
debugpri("recvfrom error\n");
close(sockfd);
return -;
}
else if(recv_len > )
{
debugpri("receiv data\n");
getNewTime(buf,ptimeval);
debugpri("sec = %d usec = %d",ptimeval->tv_sec ,ptimeval->tv_usec); break;
}
}
else
{
debugpri("count %d \n",count);
usleep(*);
count ++;
}
}
if(count >=)
{
debugpri("getNewTime timeout ! \n");
close(sockfd);
return -;
}
close(sockfd);
return ptimeval->tv_sec;
}
C实现一个NTP客户端,可以从指定IP的NTP服务器获取时间戳的更多相关文章
- 授权指定ip访问mysql 服务器
授权指定ip访问访问 授权ROOT使用密码1234从应用服务器主机连接到mysql服务器 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'xxx. ...
- 指定ip地址登陆服务器
[root@localhost ~]# cat /etc/hosts.allow ## hosts.allow This file contains access rules which are ...
- 003.NTP客户端配置
一 NTP客户端同步方式 ntpdate定时任务同步 ntp服务同步 二 ntpdate定时任务同步 2.1 安装ntp软件 [root@client ~]# yum -y install ntp # ...
- 搭建DHCP服务实现动态分配IP地址-NTP网络时间同步
本节所讲内容: DHCP服务器工作原理 使用DHCP为局域网中的机器分配IP地址 使用DHCP为服务器分配固定IP地址 ntpdate加计划任务同步服务器时间 实验环境: 服务端:xuegod63 ...
- linux服务器ntp客户端配置【转】
转自:https://www.cnblogs.com/kerrycode/archive/2015/08/20/4744804.html 在Linux系统中,为了避免主机时间因为在长时间运行下所导致的 ...
- 一个服务器上面配置多个IP ,实现指定IP的域名请求
//配置多个IP命名using System.Net; //********************************************************************** ...
- 使用c++实现一个FTP客户端(一)
之前使用c++实现了一个FTP客户端,在这里做一些记录. 一.需要注意的几点 ①FTP是一种文件传输协议,基于TCP,所以客户端与服务器建立的连接是可靠.安全的,并且要经过三次握手的过程. ②FTP传 ...
- [Swift通天遁地]四、网络和线程-(13)创建一个Socket客户端
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议
[源码下载] 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议 作者:webabcd 介绍与众不同 windows ...
随机推荐
- XML文件的写,集合XML序列化(写)。XML文件的读,递归遍历
XML文件:必须要有一个节点.检验xml文件,可以用浏览器打开,能打开表示对,否则错. 处理方法: DOM:XmlDocument文档对象模型 Sax(事件驱动,XmlReader) XmlSeria ...
- 吴裕雄 实战python编程(2)
from urllib.parse import urlparse url = 'http://www.pm25x.com/city/beijing.htm'o = urlparse(url)prin ...
- css样式占位和不占位隐藏元素的方法
不占位隐藏:display:none; 占位隐藏:visibility:hidden;
- Week4-作业1:阅读笔记与思考
我在这三天时间里阅读了<构建之法>的第四章和第十七章,产生了一些疑问和深层次的思考. 第四章 问题1: 书中第68页提到“注释(包括所有源代码)应该只用ASCII字符,不要用中文或其他特殊 ...
- Python 字符串操作,截取,长度
1.字符串操作: 字符串长度: s = "; slen = len(s); 字符串截取: print s[:-:-] #截取,逆序隔1个取一个字符 print s[:-:-] #截取,逆序隔 ...
- Spring的属性注入, byName和byType还有注入List属性
昨天花了一晚上的时间又仔细研究了一下Spring的属性注入, 一个新的方法: 自动装载和autowire, 不过因为又想起来老师说不常用, 感觉这一晚上的时间有点亏, 还是自己太愚钝了, 反应太慢 先 ...
- 第八章 高级搜索树 (xa3)红黑树:插入
- Codeforces Round #535 (Div. 3)
E: 题意: 给出n个整数ai和m个区间[li,ri] 你可以选择一些区间,并且将区间内的数字都减一.你要选择一些区间,然后使得改变后的数列中maxbi-minbi的值最大. 题解: 假设我们已经知道 ...
- 前端知识--------HTML内容
HTML介绍 1.web服务本质 import socket sk = socket.socket() sk.bind(('127.o.o.1',8080)) sk.listen() while 1: ...
- Intellij IDEA使用Maven搭建spark开发环境(scala)
如何一步一步地在Intellij IDEA使用Maven搭建spark开发环境,并基于scala编写简单的spark中wordcount实例. 1.准备工作 首先需要在你电脑上安装jdk和scala以 ...