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 ...
随机推荐
- html5中的SessionStorage 和localStorage
html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage. sessionStorage用于本地存储一个会话(session)中的数据,这些数据只 ...
- Oracle CHAR,VARCHAR,VARCHAR2,nvarchar类型的区别与使用(转载)
一 varchar,varchar2,nvarchar,nvarchar2 四个类型都属于变长字符类型, varchar和varchar2的区别在与后者把所有字符都占两字节,前者只对汉字和全角等字符占 ...
- 【Python基础教程第2版】——第二讲:列表和元组
引言: 什么是数据结构? 数据结果是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合.Python中最常用的数据结构是序列. Python包含6种内建的序列:列表和元组(最常用:列表可以修 ...
- PAT L2-010 排座位(floyd)
布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席. 输入格式: ...
- javascript的数据检测总结
目录 javaScript的数据检测 1.typeof 2.instanceof 3.constructor 4.Object.prototype.toString.call()--------- 一 ...
- nginx反向代理架构与安装配置(一)
这里我们准备四台虚拟机,二台负载均衡(LB01,LB02),二台web服务器(WEB01,WEB02). 这里默认所有软件都安装在/data目录下. 四台虚拟机的初始安装是centos7的最小 ...
- discuz回贴通知插件实现-获取邮件内容
//自定义钩子函数,命名:模块_函数名_output()或模块_函数名() //一个是模块执行完,模板输出前执行.一个是模块执行前 //post_reply_output函数会在所有post操作中都会 ...
- CodeSmith生成SQL Server视图的实体类脚本/对应的生成模板
C#生成sql视图的实体类 using System;using System.Text;using CodeSmith.Engine;using SchemaExplorer;using Syste ...
- Legendre多项式
Legendre多项式 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Legendre多项式的递归公式
- CreateThread
CreateThread(NULL,0,ReportResultThread,this,0,&g_dwThreadId) 2. 参数说明: 第一个参数 lpThreadAttributes 表 ...