2 #include <dragonnet/peer.h>
3 #include <dragonnet/recv.h>
4 #include <dragonnet/recv_thread.h>
13 void *dragonnet_peer_recv_thread(void *g_peer)
15 DragonnetPeer *p = (DragonnetPeer *) g_peer;
18 DragonnetTypeId type_id;
22 ssize_t len = recv(p->sock, &type_id, sizeof type_id, MSG_WAITALL);
24 if (errno == ECONNRESET || errno == EPIPE || errno == ETIMEDOUT) {
33 if (len == 0 || reset) {
39 pthread_mutex_destroy(&p->mtx);
44 type_id = be16toh(type_id);
46 if (type_id >= dragonnet_num_types) {
47 fprintf(stderr, "warning: received invalid type id %d\n", type_id);
51 DragonnetType type = dragonnet_types[type_id];
53 unsigned char buf[type.siz];
54 memset(buf, 0, type.siz);
56 if (!type.deserialize(p, buf)) {
57 if (type.free != NULL)
60 fprintf(stderr, "warning: failed to deserialize package of type %d\n", type_id);
65 bool (*on_recv)(struct dragonnet_peer *, DragonnetTypeId, void *) = p->on_recv;
66 void (*on_recv_type)(DragonnetPeer *, void *) = p->on_recv_type[type_id];
68 if (on_recv != NULL && !on_recv(p, type_id, buf))
71 if (on_recv_type != NULL)
74 if (type.free != NULL)