3 #include <dragonnet/peer.h>
4 #include <dragonnet/recv.h>
5 #include <dragonnet/recv_thread.h>
13 #include <sys/socket.h>
14 #include <sys/types.h>
17 void *dragonnet_peer_recv_thread(void *g_peer)
20 pthread_setname_np(pthread_self(), "recv");
23 DragonnetPeer *p = (DragonnetPeer *) g_peer;
26 DragonnetTypeId type_id;
30 ssize_t len = recv(p->sock, &type_id, sizeof type_id, MSG_WAITALL);
32 if (errno == ECONNRESET || errno == EPIPE || errno == ETIMEDOUT) {
41 if (len == 0 || reset) {
48 pthread_mutex_destroy(&p->mtx);
53 type_id = be16toh(type_id);
55 if (type_id >= dragonnet_num_types) {
56 fprintf(stderr, "[warning] received invalid type id %d\n", type_id);
60 DragonnetType type = dragonnet_types[type_id];
62 unsigned char buf[type.siz];
63 memset(buf, 0, type.siz);
65 if (!type.deserialize(p, buf)) {
66 if (type.free != NULL)
69 fprintf(stderr, "[warning] failed to deserialize package of type %d\n", type_id);
74 bool (*on_recv)(struct dragonnet_peer *, DragonnetTypeId, void *) = p->on_recv;
75 void (*on_recv_type)(DragonnetPeer *, void *) = p->on_recv_type[type_id];
77 if (on_recv != NULL && !on_recv(p, type_id, buf))
80 if (on_recv_type != NULL)
83 if (type.free != NULL)