参考::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服务器获取时间戳的更多相关文章

  1. 授权指定ip访问mysql 服务器

      授权指定ip访问访问 授权ROOT使用密码1234从应用服务器主机连接到mysql服务器 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'xxx. ...

  2. 指定ip地址登陆服务器

    [root@localhost ~]# cat /etc/hosts.allow ## hosts.allow   This file contains access rules which are ...

  3. 003.NTP客户端配置

    一 NTP客户端同步方式 ntpdate定时任务同步 ntp服务同步 二 ntpdate定时任务同步 2.1 安装ntp软件 [root@client ~]# yum -y install ntp # ...

  4. 搭建DHCP服务实现动态分配IP地址-NTP网络时间同步

    本节所讲内容: DHCP服务器工作原理 使用DHCP为局域网中的机器分配IP地址 使用DHCP为服务器分配固定IP地址 ntpdate加计划任务同步服务器时间   实验环境: 服务端:xuegod63 ...

  5. linux服务器ntp客户端配置【转】

    转自:https://www.cnblogs.com/kerrycode/archive/2015/08/20/4744804.html 在Linux系统中,为了避免主机时间因为在长时间运行下所导致的 ...

  6. 一个服务器上面配置多个IP ,实现指定IP的域名请求

    //配置多个IP命名using System.Net; //********************************************************************** ...

  7. 使用c++实现一个FTP客户端(一)

    之前使用c++实现了一个FTP客户端,在这里做一些记录. 一.需要注意的几点 ①FTP是一种文件传输协议,基于TCP,所以客户端与服务器建立的连接是可靠.安全的,并且要经过三次握手的过程. ②FTP传 ...

  8. [Swift通天遁地]四、网络和线程-(13)创建一个Socket客户端

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  9. 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议

    [源码下载] 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议 作者:webabcd 介绍与众不同 windows ...

随机推荐

  1. 初涉定制linux系统之——rpm相关安装包的准备

    在上一篇博客http://www.cnblogs.com/dengtr/p/5543820.html#3634582 中介绍了如何定制Centos系统镜像,但其中有个问题,就是服务所依赖的安装包不在原 ...

  2. winform程序开机启动时的运行目录

    并不是程序的当前路径,而是系统的某个目录 如环境是win10 64位,路径是 c:\winfows\SysWOW64\ConfigInfor.json

  3. Nsis Sqlite Plugin

    1.https://stackoverflow.com/questions/15346338/nsis-and-sqlite-integration 2.http://nsis.sourceforge ...

  4. drupal 7.1 doc

    https://www.drupal.org/docs/8/api/database-api/dynamic-queries/count-queries https://www.drupal.org/ ...

  5. print 不换行

    [print 不换行] 参考:http://zhidao.baidu.com/link?url=-qC2RyT5_GWzW_N-SyqJYgegVt2sSXwmMWGvHfk_4MjErhm_Pj23 ...

  6. Git操作的一些注意

    这是在在学习Git时遇到的一些需要注意的地方,都是一些小细节的地方,可能会有错误的地方,希望大家可以指出谢谢   1.git使用,安装后,首先要打开git bash   2.必须登录后才可以操作git ...

  7. hdoj1260 Tickets (简单DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1260 思路: 很简单的DP题,状态方程也比较容易想到,用f[i]表示到第i个人所耗的最短时间,详见代码 ...

  8. Appium原理初步--Android自动化测试学习历程

    章节:自动化基础篇——Appium原理初步(第七讲) 本期关键词: Appium.跨语言跨平台.Bootstrap 主要讲解内容及笔记: 一.what is appium 一种封装了uiautomat ...

  9. vs2008 FileUpload 上传控件 Gridview传多个值

    拖fileupload控件,控件后加button1 lable1 lable2,还要在与本窗体同意目录下新建img文件夹protected void Button1_Click(object send ...

  10. Scrum 项目3.0--软件工程

    1. 确保product backlog井然有序.(参考示例图1) (例图1) 2.把故事进一步拆分成任务.(参考示例图2) (例图2) 3. 形成Sprint backlog. Scrum mast ...