]> git.lizzy.rs Git - dragonnet-example.git/blob - cs_example.c
Use demo packets for ping-pong communication
[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 recv_type_func(DragonnetPeer *p, u16 type_id)
19 {
20         char *str_addr = dragonnet_addr_str(p->raddr);
21         printf("type %d from %s\n", type_id, str_addr);
22         free(str_addr);
23
24         if (type_id == DRAGONNET_TYPE_PINGPACKET) {
25                 PingPacket ping = dragonnet_peer_recv_PingPacket(p);
26                 printf("PingPacket number: 0x%08x\n", ping.number);
27
28                 PongPacket pong = {
29                         .number = ping.number
30                 };
31                 dragonnet_peer_send_PongPacket(p, pong);
32
33                 dragonnet_listener_close(l);
34                 dragonnet_listener_delete(l);
35                 l = NULL;
36
37                 dragonnet_peer_close(p);
38                 dragonnet_peer_delete(p);
39         } else if (type_id == DRAGONNET_TYPE_PONGPACKET) {
40                 PongPacket pong = dragonnet_peer_recv_PongPacket(p);
41                 printf("PongPacket number: 0x%08x\n", pong.number);
42
43                 dragonnet_peer_close(p);
44                 dragonnet_peer_delete(p);
45         }
46 }
47
48 static void *srv_func(__attribute((unused)) void *unused)
49 {
50         l = dragonnet_listener_new("[::1]:50000", &connect_func, &recv_type_func);
51         assert(l != NULL);
52
53         dragonnet_listener_run(l);
54         return NULL;
55 }
56
57 static void *clt_func(__attribute((unused)) void *unused)
58 {
59         while (l == NULL);
60
61         DragonnetPeer *p = dragonnet_connect("[::1]:50000", &recv_type_func);
62         assert(p != NULL);
63
64         dragonnet_peer_run(p);
65
66         PingPacket ping = {
67                 .number = 0xdba
68         };
69         dragonnet_peer_send_PingPacket(p, ping);
70
71         return NULL;
72 }
73
74 int main(__attribute((unused)) int argc, __attribute((unused)) char **argv)
75 {
76         pthread_t srv_thread, clt_thread;
77         pthread_create(&srv_thread, NULL, &srv_func, NULL);
78         pthread_create(&clt_thread, NULL, &clt_func, NULL);
79
80         pthread_join(clt_thread, NULL);
81         pthread_join(srv_thread, NULL);
82
83         while (true);
84 }