p->laddr = l->laddr;
p->raddr = dragonnet_addr_parse_sock(addr);
- if (setsockopt(p->sock, SOL_SOCKET, SO_RCVTIMEO, &dragonnet_timeout,
- sizeof dragonnet_timeout) < 0) {
- perror("setsockopt");
- return false;
- }
-
- if (setsockopt(p->sock, SOL_SOCKET, SO_SNDTIMEO, &dragonnet_timeout,
- sizeof dragonnet_timeout) < 0) {
- perror("setsockopt");
- return false;
- }
-
pthread_rwlock_unlock(&p->mu);
return true;
}
#include "peer.h"
#include "recv_thread.h"
-const struct timeval dragonnet_timeout = {
- .tv_sec = 30,
- .tv_usec = 0
-};
-
static bool dragonnet_peer_init(DragonnetPeer *p, char *addr)
{
pthread_rwlock_init(&p->mu, NULL);
p->sock = socket(AF_INET6, SOCK_STREAM, 0);
p->raddr = dragonnet_addr_parse_str(addr);
- if (setsockopt(p->sock, SOL_SOCKET, SO_RCVTIMEO, &dragonnet_timeout,
- sizeof dragonnet_timeout) < 0) {
- perror("setsockopt");
- return false;
- }
-
- if (setsockopt(p->sock, SOL_SOCKET, SO_SNDTIMEO, &dragonnet_timeout,
- sizeof dragonnet_timeout) < 0) {
- perror("setsockopt");
- return false;
- }
-
struct sockaddr_in6 sock_addr = dragonnet_addr_sock(p->raddr);
if (connect(p->sock, (const struct sockaddr *) &sock_addr,
sizeof sock_addr) < 0) {
#include "addr.h"
-extern const struct timeval dragonnet_timeout;
-
typedef enum {
DRAGONNET_PEER_CREATED,
DRAGONNET_PEER_ACTIVE,
#include <assert.h>
#include <dragontype/number.h>
-#include <errno.h>
#include <pthread.h>
#include <stdbool.h>
#include <stdio.h>
while (true) {
u16 msg;
+ // Copy socket fd so that shutdown doesn't block
pthread_rwlock_rdlock(&p->mu);
- ssize_t len = recv(p->sock, &msg, sizeof msg, MSG_WAITALL);
+ int sock = p->sock;
pthread_rwlock_unlock(&p->mu);
- if (len < 0 && errno != EWOULDBLOCK) {
+ ssize_t len = recv(sock, &msg, sizeof msg, MSG_WAITALL);
+
+ if (len < 0) {
perror("recv");
dragonnet_peer_delete(p);
return NULL;
}
- // connection closed
- if ((len >= 0 && len != sizeof msg) || errno == EWOULDBLOCK) {
+ // Connection closed
+ if (len == 0) {
pthread_rwlock_wrlock(&p->mu);
close(p->sock);
- p->sock = 0;
+ p->sock = -1;
p->state++;
pthread_rwlock_unlock(&p->mu);
return NULL;
}
- // deserialization
+ // Deserialization
}
}