diff --git a/src/knot/server/tcp-handler.c b/src/knot/server/tcp-handler.c
index f8fe90bb4caa14c36d5f641e376b287aa8677465..8d52fd347c0e2d0885f5fe2f2119083ada200d8c 100644
--- a/src/knot/server/tcp-handler.c
+++ b/src/knot/server/tcp-handler.c
@@ -394,15 +394,21 @@ int tcp_send(int fd, uint8_t *msg, size_t msglen)
 	int uncork = setsockopt(fd, SOL_TCP, TCP_CORK, &cork, sizeof(cork));
 #endif
 
+	/* Flags. */
+	int flags = 0;
+#ifdef MSG_NOSIGNAL
+	flags |= MSG_NOSIGNAL;
+#endif
+
 	/* Send message size. */
 	unsigned short pktsize = htons(msglen);
-	int sent = send(fd, &pktsize, sizeof(pktsize), 0);
+	int sent = send(fd, &pktsize, sizeof(pktsize), flags);
 	if (sent < 0) {
 		return KNOT_ERROR;
 	}
 
 	/* Send message data. */
-	sent = send(fd, msg, msglen, 0);
+	sent = send(fd, msg, msglen, flags);
 	if (sent < 0) {
 		return KNOT_ERROR;
 	}
@@ -421,9 +427,15 @@ int tcp_send(int fd, uint8_t *msg, size_t msglen)
 
 int tcp_recv(int fd, uint8_t *buf, size_t len, sockaddr_t *addr)
 {
+	/* Flags. */
+	int flags = MSG_WAITALL;
+#ifdef MSG_NOSIGNAL
+	flags |= MSG_NOSIGNAL;
+#endif
+
 	/* Receive size. */
 	unsigned short pktsize = 0;
-	int n = recv(fd, &pktsize, sizeof(unsigned short), MSG_WAITALL);
+	int n = recv(fd, &pktsize, sizeof(unsigned short), flags);
 	if (n < 0) {
 		if (errno == EAGAIN) {
 			return KNOT_EAGAIN;
@@ -455,7 +467,7 @@ int tcp_recv(int fd, uint8_t *buf, size_t len, sockaddr_t *addr)
 	}
 
 	/* Receive payload. */
-	n = recv(fd, buf, pktsize, MSG_WAITALL);
+	n = recv(fd, buf, pktsize, flags);
 	if (n < 0) {
 		if (errno == EAGAIN) {
 			return KNOT_EAGAIN;