-
Notifications
You must be signed in to change notification settings - Fork 3
/
reqreptest.c
129 lines (113 loc) · 2.96 KB
/
reqreptest.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#define CLIENT "client"
#define SERVER "server"
#define DATECMD 1
#define PUT64(ptr, u) \
do { \
(ptr)[0] = (uint8_t)(((uint64_t)(u)) >> 56); \
(ptr)[1] = (uint8_t)(((uint64_t)(u)) >> 48); \
(ptr)[2] = (uint8_t)(((uint64_t)(u)) >> 40); \
(ptr)[3] = (uint8_t)(((uint64_t)(u)) >> 32); \
(ptr)[4] = (uint8_t)(((uint64_t)(u)) >> 24); \
(ptr)[5] = (uint8_t)(((uint64_t)(u)) >> 16); \
(ptr)[6] = (uint8_t)(((uint64_t)(u)) >> 8); \
(ptr)[7] = (uint8_t)((uint64_t)(u)); \
} while (0)
#define GET64(ptr, v) \
v = (((uint64_t)((uint8_t)(ptr)[0])) << 56) + \
(((uint64_t)((uint8_t)(ptr)[1])) << 48) + \
(((uint64_t)((uint8_t)(ptr)[2])) << 40) + \
(((uint64_t)((uint8_t)(ptr)[3])) << 32) + \
(((uint64_t)((uint8_t)(ptr)[4])) << 24) + \
(((uint64_t)((uint8_t)(ptr)[5])) << 16) + \
(((uint64_t)((uint8_t)(ptr)[6])) << 8) + \
(((uint64_t)(uint8_t)(ptr)[7]))
void
fatal(const char *func, int rv)
{
fprintf(stderr, "%s: %s\n", func, nng_strerror(rv));
exit(1);
}
void
showdate(time_t now)
{
struct tm *info = localtime(&now);
printf("%s", asctime(info));
}
int
server(const char *url)
{
nng_socket sock;
int rv;
if ((rv = nng_rep0_open(&sock)) != 0) {
fatal("nng_rep0_open", rv);
}
if ((rv = nng_listen(sock, url, NULL, 0)) != 0) {
fatal("nng_listen", rv);
}
for (;;) {
char * buf = NULL;
size_t sz;
uint64_t val;
if ((rv = nng_recv(sock, &buf, &sz, NNG_FLAG_ALLOC)) != 0) {
fatal("nng_recv", rv);
}
if ((sz == sizeof(uint64_t)) &&
((GET64(buf, val)) == DATECMD)) {
time_t now;
printf("SERVER: RECEIVED DATE REQUEST\n");
now = time(&now);
printf("SERVER: SENDING DATE: ");
showdate(now);
// Reuse the buffer. We know it is big enough.
PUT64(buf, (uint64_t) now);
rv = nng_send(sock, buf, sz, NNG_FLAG_ALLOC);
if (rv != 0) {
fatal("nng_send", rv);
}
continue;
}
// Unrecognized command, so toss the buffer.
nng_free(buf, sz);
}
}
int
client(const char *url)
{
nng_socket sock;
int rv;
size_t sz;
char * buf = NULL;
uint8_t cmd[sizeof(uint64_t)];
PUT64(cmd, DATECMD);
if ((rv = nng_req0_open(&sock)) != 0) {
fatal("nng_socket", rv);
}
if ((rv = nng_dial(sock, url, NULL, 0)) != 0) {
fatal("nng_dial", rv);
}
printf("CLIENT: SENDING DATE REQUEST\n");
if ((rv = nng_send(sock, cmd, sizeof(cmd), 0)) != 0) {
fatal("nng_send", rv);
}
if ((rv = nng_recv(sock, &buf, &sz, NNG_FLAG_ALLOC)) != 0) {
fatal("nng_recv", rv);
}
if (sz == sizeof(uint64_t)) {
uint64_t now;
GET64(buf, now);
printf("CLIENT: RECEIVED DATE: ");
showdate((time_t) now);
} else {
printf("CLIENT: GOT WRONG SIZE!\n");
}
// This assumes that buf is ASCIIZ (zero terminated).
nng_free(buf, sz);
nng_close(sock);
return (0);
}
NAN_METHOD(client){
client("tcp://127.0.0.1:5555");
}
NAN_METHOD(server){
server("tcp://127.0.0.1:5555");
}