3 #include <dragonnet/peer.h>
4 #include <dragonnet/recv.h>
5 #include <dragonnet/recv_thread.h>
15 void *dragonnet_peer_recv_thread(void *g_peer)
18 pthread_setname_np(pthread_self(), "recv");
21 DragonnetPeer *p = (DragonnetPeer *) g_peer;
24 DragonnetTypeId type_id;
28 ssize_t len = recv(p->sock, &type_id, sizeof type_id, MSG_WAITALL);
30 if (errno == ECONNRESET || errno == EPIPE || errno == ETIMEDOUT) {
39 if (len == 0 || reset) {
45 pthread_mutex_destroy(&p->mtx);
50 type_id = be16toh(type_id);
52 if (type_id >= dragonnet_num_types) {
53 fprintf(stderr, "warning: received invalid type id %d\n", type_id);
57 DragonnetType type = dragonnet_types[type_id];
59 unsigned char buf[type.siz];
60 memset(buf, 0, type.siz);
62 if (!type.deserialize(p, buf)) {
63 if (type.free != NULL)
66 fprintf(stderr, "warning: failed to deserialize package of type %d\n", type_id);
71 bool (*on_recv)(struct dragonnet_peer *, DragonnetTypeId, void *) = p->on_recv;
72 void (*on_recv_type)(DragonnetPeer *, void *) = p->on_recv_type[type_id];
74 if (on_recv != NULL && !on_recv(p, type_id, buf))
77 if (on_recv_type != NULL)
80 if (type.free != NULL)