#include <stdio.h>
#include <string.h>
#include<WS2tcpip.h>
#include <windows.h>
#include <time.h>
#pragma comment(lib,"ws2_32.lib")
#define NTP_VERSION 3
#define NTP_MODE_CLIENT 0x3
#define NTP_HEADER_VERSION_SET(_header, _x) (_header |= ((_x & 0x7) << 0))
#define NTP_HEADER_MODE_SET(_header, _x) (_header |= ((_x & 0x7) << 3))
typedef struct
{
int seconds;
int fraction;
} ntp_timestamp;
typedef struct
{
int header;
int root_delay;
int root_dispersion;
int reference_identifier;
ntp_timestamp reference_timestamp;
ntp_timestamp originate_timestamp;
ntp_timestamp receive_timestamp;
ntp_timestamp transmit_timestamp;
} ntp_rsp_msg;
void print_words(size_t num_words, int buffer[])
{
size_t word_i;
for(word_i = 0; word_i < num_words; word_i++)
{
printf("%2lu: %#x\n", word_i, buffer[word_i]);
}
}
int main(void)
{
const int ntp_port = 123;
const char * ntp_host = "210.72.145.44";
int ntp_socket;
int xit_addrlen = sizeof(struct sockaddr_in);
struct sockaddr_in server;
ntp_rsp_msg ntp_req_msg;
int receive_len;
ntp_rsp_msg ntp_rsp_msg;
long seconds;
WSADATA data;
WORD version = MAKEWORD(2, 2);
WSAStartup(version, &data);
ntp_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (ntp_socket == -1)
{
perror("Failed to create socket");
return 0;
}
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(ntp_port);
server.sin_addr.s_addr = inet_addr(ntp_host);
if (server.sin_addr.s_addr == INADDR_NONE)
{
fprintf(stderr, "Failed to resolve hostname %s\n", ntp_host);
return 0;
}
memset(&ntp_req_msg, 0, sizeof(ntp_req_msg));
NTP_HEADER_VERSION_SET(ntp_req_msg.header, NTP_VERSION);
NTP_HEADER_MODE_SET(ntp_req_msg.header, NTP_MODE_CLIENT);
printf("Sending NTP request to %s:%d\n", ntp_host, ntp_port);
if (sendto(ntp_socket,
(char *)&ntp_req_msg, sizeof(ntp_req_msg),
0,
(struct sockaddr *) &server, sizeof(struct sockaddr_in))==1)
{
perror("Failed to send NTP request");
return 0;
}
printf("Waiting for NTP response...\n");
receive_len = recvfrom(ntp_socket,
(char *)&ntp_rsp_msg, sizeof(ntp_rsp_msg),
0,
NULL,
0);
if (receive_len <= 0)
{
perror("Failed to receive NTP response");
return 0;
}
printf("Received %d bytes\n", receive_len);
print_words(receive_len/sizeof(int), (int *)&ntp_rsp_msg);
seconds = ntohl(ntp_rsp_msg.transmit_timestamp.seconds);
printf("Transmit seconds: %lu\n", seconds);
ntp_socket = -1;
return 1;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280055.html
標籤:網絡通信
下一篇:orcad刪掉的元件一直存在?