13 #include "recv_thread.h"
16 void *dragonnet_peer_recv_thread(void *g_peer)
19 pthread_setname_np(pthread_self(), "recv");
22 DragonnetPeer *p = (DragonnetPeer *) g_peer;
25 DragonnetTypeId type_id;
29 ssize_t len = recv(p->sock, (void *) &type_id, sizeof type_id, MSG_WAITALL);
31 if (errno == ECONNRESET || errno == EPIPE || errno == ETIMEDOUT) {
40 if (len != sizeof type_id || reset) {
47 pthread_mutex_destroy(&p->mtx);
52 type_id = be16toh(type_id);
54 if (type_id >= dragonnet_num_types) {
55 fprintf(stderr, "[warning] received invalid type id %d\n", type_id);
59 DragonnetType type = dragonnet_types[type_id];
61 unsigned char buf[type.siz];
62 memset(buf, 0, type.siz);
64 if (!type.deserialize(p, buf)) {
65 if (type.free != NULL)
68 fprintf(stderr, "[warning] failed to deserialize package of type %d\n", type_id);
73 bool (*on_recv)(struct dragonnet_peer *, DragonnetTypeId, void *) = p->on_recv;
74 void (*on_recv_type)(DragonnetPeer *, void *) = p->on_recv_type[type_id];
76 if (on_recv != NULL && !on_recv(p, type_id, buf))
79 if (on_recv_type != NULL)
82 if (type.free != NULL)