2 #include <dragonnet/peer.h>
3 #include <dragonnet/recv.h>
4 #include <dragonnet/recv_thread.h>
9 static bool dragonnet_peer_init(DragonnetPeer *p, char *addr)
11 pthread_mutex_init(&p->mtx, NULL);
13 p->sock = socket(AF_INET6, SOCK_STREAM, 0);
14 p->raddr = dragonnet_addr_parse_str(addr);
15 p->on_disconnect = NULL;
17 p->on_recv_type = calloc(sizeof *p->on_recv_type, dragonnet_num_types);
19 struct sockaddr_in6 sock_addr = dragonnet_addr_sock(p->raddr);
20 if (connect(p->sock, (const struct sockaddr *) &sock_addr,
21 sizeof sock_addr) < 0) {
26 struct sockaddr_in6 sock_name;
27 socklen_t sock_namelen = sizeof sock_name;
29 if (getsockname(p->sock, (struct sockaddr *) &sock_name, &sock_namelen) < 0) {
30 perror("getsockname");
34 p->laddr = dragonnet_addr_parse_sock(sock_name);
38 DragonnetPeer *dragonnet_connect(char *addr)
40 DragonnetPeer *p = malloc(sizeof *p);
41 if (!dragonnet_peer_init(p, addr)) {
42 pthread_mutex_destroy(&p->mtx);
50 void dragonnet_peer_run(DragonnetPeer *p)
52 pthread_create(&p->recv_thread, NULL, &dragonnet_peer_recv_thread, p);
55 void dragonnet_peer_shutdown(DragonnetPeer *p)
57 shutdown(p->sock, SHUT_RDWR);