NTP 客户端代码 服务端openwrt 的ntpd

来源:互联网 发布:冒险岛766数据库403 编辑:程序博客网 时间:2024/05/23 15:45
#define  TIMEDIFF (0x83aa7e80) //2209075200LU #define  NTP_HEAD_LEN 48typedef struct  {  int L1;  int Version;  int mode;  char stratum;  char poll;  char precision;  unsigned long root_delay;  unsigned long root_dispersion;  unsigned long reference_identifier;  time_t reference_timestamp;  time_t originate_timestamp;  time_t receive_timestamp;  time_t transmit_timestamp;//should be 64bit }ntp;void pack_ntp_data(char buf[NTP_HEAD_LEN], ntp const *ntp_packet) {  memset(buf, 0x00, NTP_HEAD_LEN); buf[0] = (ntp_packet->L1<<6) | (ntp_packet->Version<<3) | (ntp_packet->mode);  buf[1] = ntp_packet->stratum;  buf[2] = ntp_packet->poll;  buf[3] = ntp_packet->precision;  memcpy(buf + 4, &ntp_packet->root_delay, 2);  printf("time : %lu\n", ntp_packet->transmit_timestamp);  memcpy(buf + 40, &ntp_packet->transmit_timestamp, 4); }void unpack_ntp_data(char *data) {  __time64_t transmit_time;  struct tm *localtm; memcpy(&transmit_time, data + 32, 4);  transmit_time = ntohl(transmit_time) - TIMEDIFF;  printf("transmit time : %llx\n", transmit_time);  //time(&time_tmp);  localtm= gmtime(&transmit_time);  printf("Year : %d month : %d dat : %d h : %d m : %d s:%d",   localtm->tm_year + 1900,   localtm->tm_mon + 1,   localtm->tm_mday,   localtm->tm_hour + 8,   localtm->tm_min,   localtm->tm_sec); }int _tmain(int argc, _TCHAR* argv[]) {  int ret = -1;  char buf[NTP_HEAD_LEN];  sockaddr_in server_addr;  SOCKET sockfd;  ntp ntp_packet; WSADATA wsaData;  int iResult; iResult = WSAStartup(MAKEWORD(2,2), &wsaData);  if (iResult != NO_ERROR) {   printf("WSAStartup failed: %d\n", iResult);   WSACleanup();   return 1;  } sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  if (sockfd == 0)  {   printf("fail to create socket\n");   WSACleanup();   return 0;  }  server_addr.sin_port = htons(123);  server_addr.sin_family = AF_INET;  server_addr.sin_addr.s_addr = inet_addr("192.168.0.100");//202.120.2.101 ret = connect(sockfd, (sockaddr*)&server_addr,sizeof(server_addr)); if (ret == SOCKET_ERROR)  {   printf("fail to connect to server\n");   WSACleanup();   return 0;  }  ntp_packet.L1 = 0;//no warning  ntp_packet.Version = 3;  ntp_packet.mode = 3;//client  ntp_packet.stratum = 0;  ntp_packet.poll = 5;  ntp_packet.root_delay = 0;  ntp_packet.precision = -6;  //time(&ntp_packet.transmit_timestamp);  pack_ntp_data(buf, &ntp_packet);// ret = send(sockfd, buf, NTP_HEAD_LEN, 0); ret=sendto(sockfd,buf,NTP_HEAD_LEN,0,(sockaddr *)&server_addr,sizeof(server_addr)); if (ret == SOCKET_ERROR)  {   printf("send data to server error\n");   return 0;  } while(1)  {   int len=sizeof(server_addr);  //ret = recv(sockfd, buf, sizeof(char) * 48, MSG_WAITALL);   ret = recvfrom(sockfd, buf, sizeof(char) * NTP_HEAD_LEN, 0,(sockaddr *)&server_addr,&len);  if (ret > 0)   {    printf("receive data from server ret : %d\n", ret);    unpack_ntp_data(buf);    break;   }   else if (ret == 0)   {    printf("connection closed\n");   }   else    printf("recv failed\n");   Sleep(1000);         }  closesocket(sockfd);  WSACleanup(); return 0; }


 

原创粉丝点击