Skip to content

Commit 53cb0a0

Browse files
First UDP socket example: NTP client
1 parent 9825acc commit 53cb0a0

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

sockets/UDP/ntp_client.c

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <string.h>
4+
#include <time.h>
5+
#include <sys/types.h>
6+
#include <sys/socket.h>
7+
#include <netinet/in.h>
8+
#include <netdb.h>
9+
10+
#define oops(msg,x) {perror(msg);exit(x);}
11+
#define VERSION "0.1"
12+
#define NTP_TIMESTAMP_DELTA 2208988800ull
13+
14+
void usage(char** argv)
15+
{
16+
printf("Yet another NTP client v%s\n", VERSION);
17+
printf("Usage: %s <hostname OR ip_address>\n", *argv); //example: 64.113.32.5
18+
exit(1);
19+
}
20+
21+
int main(int argc, char* argv[])
22+
{
23+
if (argc != 2)
24+
usage(argv);
25+
26+
typedef struct
27+
{
28+
unsigned leap : 2;
29+
unsigned ver : 3;
30+
unsigned mode : 3;
31+
32+
uint8_t stratum;
33+
uint8_t poll;
34+
uint8_t precision;
35+
36+
uint32_t root_delay;
37+
uint32_t root_dis;
38+
uint32_t ref_id;
39+
40+
uint32_t ref_Tm_s;
41+
uint32_t ref_Tm_f;
42+
43+
uint32_t orig_Tm_s;
44+
uint32_t orig_Tm_f;
45+
46+
uint32_t rcv_Tm_s;
47+
uint32_t rcv_Tm_f;
48+
49+
uint32_t tsm_Tm_s;
50+
uint32_t tsm_xTm_f;
51+
} ntp_packet;
52+
53+
ntp_packet packet = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
54+
*((char *) &packet + 0) = 0x1b;
55+
56+
struct sockaddr_in serv_addr;
57+
struct hostent *server;
58+
int sockfd;
59+
60+
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
61+
oops("can't create socket", 2);
62+
63+
if ((server = gethostbyname(*++argv)) == NULL)
64+
oops("can't find this host", 2);
65+
66+
bzero((void *)&serv_addr, sizeof(serv_addr));
67+
bcopy((void *)server->h_addr, (void *)&serv_addr.sin_addr, server->h_length);
68+
69+
serv_addr.sin_port = htons(123);
70+
serv_addr.sin_family = AF_INET;
71+
72+
if (sendto(sockfd, &packet, sizeof(packet), 0,
73+
(struct sockaddr *) &serv_addr, sizeof(serv_addr)) == -1)
74+
oops("sendto failed", 3);
75+
76+
socklen_t saddrlen = sizeof(serv_addr);
77+
if (recvfrom(sockfd, (char*) &packet, sizeof(packet), 0,
78+
(struct sockaddr *) &serv_addr, &saddrlen) == -1)
79+
oops("recvfrom failed", 3)
80+
81+
packet.tsm_Tm_s = ntohl(packet.tsm_Tm_s);
82+
time_t tTm = (time_t) (packet.tsm_Tm_s - NTP_TIMESTAMP_DELTA);
83+
84+
printf("Time: %s", ctime((const time_t*) &tTm));
85+
return 0;
86+
}

0 commit comments

Comments
 (0)