]> git.lizzy.rs Git - dragonnet-example.git/blob - cs_example.c
Use new dragonnet hook API
[dragonnet-example.git] / cs_example.c
1 #include <assert.h>
2 #include <pthread.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5
6 #include "deps/dragonnet/listen.h"
7 #include "dnet-types.h"
8
9 static DragonnetListener *l;
10
11 static void connect_func(DragonnetPeer *p)
12 {
13         char *str_addr = dragonnet_addr_str(p->raddr);
14         printf("new connection from %s\n", str_addr);
15         free(str_addr);
16 }
17
18 static void handle_pingpacket(DragonnetPeer *p, PingPacket *ping)
19 {
20         printf("PingPacket number: 0x%08x\n", ping->number);
21
22         dragonnet_peer_send_PongPacket(p, &(PongPacket) {
23                 .number = ping->number
24         });
25
26         dragonnet_listener_close(l);
27         dragonnet_listener_delete(l);
28         l = NULL;
29
30         dragonnet_peer_close(p);
31         dragonnet_peer_delete(p);
32 }
33
34 static void handle_pongpacket(DragonnetPeer *p, PongPacket *pong)
35 {
36         printf("PongPacket number: 0x%08x\n", pong->number);
37
38         dragonnet_peer_close(p);
39         dragonnet_peer_delete(p);
40 }
41
42 static void *srv_func(__attribute((unused)) void *unused)
43 {
44         l = dragonnet_listener_new("[::1]:50000", &connect_func);
45         assert(l != NULL);
46
47         dragonnet_listener_set_recv_hook(l, DRAGONNET_TYPE_PINGPACKET,
48                         (void (*)(DragonnetPeer *, void *)) &handle_pingpacket);
49         dragonnet_listener_run(l);
50         return NULL;
51 }
52
53 static void *clt_func(__attribute((unused)) void *unused)
54 {
55         while (l == NULL);
56
57         DragonnetPeer *p = dragonnet_connect("[::1]:50000");
58         assert(p != NULL);
59
60         dragonnet_peer_set_recv_hook(p, DRAGONNET_TYPE_PONGPACKET,
61                         (void (*)(DragonnetPeer *, void *)) &handle_pongpacket);
62         dragonnet_peer_run(p);
63
64         dragonnet_peer_send_PingPacket(p, &(PingPacket) {
65                 .number = 0xdba
66         });
67
68         return NULL;
69 }
70
71 int main(__attribute((unused)) int argc, __attribute((unused)) char **argv)
72 {
73         pthread_t srv_thread, clt_thread;
74         pthread_create(&srv_thread, NULL, &srv_func, NULL);
75         pthread_create(&clt_thread, NULL, &clt_func, NULL);
76
77         pthread_join(clt_thread, NULL);
78         pthread_join(srv_thread, NULL);
79
80         while (true);
81 }