diff --git a/src/tincctl.c b/src/tincctl.c
index fdb72e05..81e7a7a2 100644
--- a/src/tincctl.c
+++ b/src/tincctl.c
@@ -39,6 +39,10 @@
 #include "tincctl.h"
 #include "top.h"
 
+#ifndef MSG_NOSIGNAL
+#define MSG_NOSIGNAL 0
+#endif
+
 static char **orig_argv;
 static int orig_argc;
 
@@ -529,7 +533,7 @@ bool sendline(int fd, char *format, ...) {
 	blen++;
 
 	while(blen) {
-		int result = send(fd, p, blen, 0);
+		int result = send(fd, p, blen, MSG_NOSIGNAL);
 		if(result == -1 && errno == EINTR)
 			continue;
 		else if(result <= 0)
@@ -741,6 +745,11 @@ bool connect_tincd(bool verbose) {
 	freeaddrinfo(res);
 #endif
 
+#ifdef SO_NOSIGPIPE
+	static const int one = 1;
+	setsockopt(c, SOL_SOCKET, SO_NOSIGPIPE, (void *)&one, sizeof one);
+#endif
+
 	char data[4096];
 	int version;
 
diff --git a/src/top.c b/src/top.c
index 4db93043..2824261c 100644
--- a/src/top.c
+++ b/src/top.c
@@ -66,8 +66,10 @@ static float bscale = 1;
 static const char *punit = "pkts";
 static float pscale = 1;
 
-static void update(int fd) {
-	sendline(fd, "%d %d", CONTROL, REQ_DUMP_TRAFFIC);
+static bool update(int fd) {
+	if(!sendline(fd, "%d %d", CONTROL, REQ_DUMP_TRAFFIC))
+		return false;
+
 	gettimeofday(&cur, NULL);
 
 	timersub(&cur, &prev, &diff);
@@ -90,13 +92,10 @@ static void update(int fd) {
 		int n = sscanf(line, "%d %d %s %"PRIu64" %"PRIu64" %"PRIu64" %"PRIu64, &code, &req, name, &in_packets, &in_bytes, &out_packets, &out_bytes);
 
 		if(n == 2)
-			break;
+			return true;
 
-		if(n != 7) {
-			endwin();
-			fprintf(stderr, "Error receiving traffic information\n");
-			exit(1);
-		}
+		if(n != 7)
+			return false;
 
 		nodestats_t *found = NULL;
 
@@ -133,6 +132,8 @@ static void update(int fd) {
 		found->out_packets = out_packets;
 		found->out_bytes = out_bytes;
 	}
+
+	return false;
 }
 
 static int cmpfloat(float a, float b) {
@@ -246,7 +247,9 @@ void top(int fd) {
 	bool running = true;
 
 	while(running) {
-		update(fd);
+		if(!update(fd))
+			break;
+
 		redraw();
 
 		switch(getch()) {