]> git.lizzy.rs Git - dragonnet-example.git/blob - cs_example.c
Depreate
[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         Blob blob = ping->compr_blob->blob;
21
22         printf("PingPacket siz: 0x%08x\n", blob->siz);
23         printf("PingPacket compr_siz: 0x%08x\n", ping->compr_blob->siz);
24         printf("PingPacket data: 0x%02x%02x\n", blob->data[0], blob->data[1]);
25
26         free(blob->data);
27         free(blob);
28
29         dragonnet_peer_send_PongPacket(p, &(PongPacket) {
30                 .number = 0xdba,
31                 .num_array = {0xd, 0xba},
32                 .nested_array = {
33                         {0xd, 0xba},
34                         {0x13, 0x37}
35                 }
36         });
37
38         dragonnet_listener_close(l);
39         dragonnet_listener_delete(l);
40         l = NULL;
41
42         dragonnet_peer_close(p);
43         dragonnet_peer_delete(p);
44 }
45
46 static void handle_pongpacket(DragonnetPeer *p, PongPacket *pong)
47 {
48         printf("PongPacket number: 0x%08x\n", pong->number);
49         printf("PongPacket num_array[0]: 0x%02x\n", pong->num_array[0]);
50         printf("PongPacket num_array[1]: 0x%02x\n", pong->num_array[1]);
51         printf("PongPacket nested_array[0][0]: 0x%02x\n", pong->nested_array[0][0]);
52         printf("PongPacket nested_array[0][1]: 0x%02x\n", pong->nested_array[0][1]);
53         printf("PongPacket nested_array[1][0]: 0x%02x\n", pong->nested_array[1][0]);
54         printf("PongPacket nested_array[1][1]: 0x%02x\n", pong->nested_array[1][1]);
55
56         dragonnet_peer_close(p);
57         dragonnet_peer_delete(p);
58 }
59
60 static void *srv_func(__attribute((unused)) void *unused)
61 {
62         l = dragonnet_listener_new("[::1]:50000", &connect_func);
63         assert(l != NULL);
64
65         dragonnet_listener_set_recv_hook(l, DRAGONNET_TYPE_PINGPACKET,
66                         (void (*)(DragonnetPeer *, void *)) &handle_pingpacket);
67         dragonnet_listener_run(l);
68         return NULL;
69 }
70
71 static void *clt_func(__attribute((unused)) void *unused)
72 {
73         while (l == NULL);
74
75         DragonnetPeer *p = dragonnet_connect("[::1]:50000");
76         assert(p != NULL);
77
78         dragonnet_peer_set_recv_hook(p, DRAGONNET_TYPE_PONGPACKET,
79                         (void (*)(DragonnetPeer *, void *)) &handle_pongpacket);
80         dragonnet_peer_run(p);
81
82         CompressedBlob compr_blob = malloc(sizeof *compr_blob);
83         compr_blob->blob = malloc(sizeof *compr_blob->blob);
84         compr_blob->blob->siz = 2;
85         compr_blob->blob->data = (u8 *) "\x0d\xba";
86
87         dragonnet_peer_send_PingPacket(p, &(PingPacket) {
88                 .compr_blob = compr_blob
89         });
90
91         free(compr_blob->blob);
92         free(compr_blob);
93         return NULL;
94 }
95
96 int main(__attribute((unused)) int argc, __attribute((unused)) char **argv)
97 {
98         pthread_t srv_thread, clt_thread;
99         pthread_create(&srv_thread, NULL, &srv_func, NULL);
100         pthread_create(&clt_thread, NULL, &clt_func, NULL);
101
102         pthread_join(clt_thread, NULL);
103         pthread_join(srv_thread, NULL);
104
105         while (true);
106 }