summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/TcpSocket.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/TcpSocket.cpp b/src/TcpSocket.cpp
index 40c1c1a..69b6df5 100644
--- a/src/TcpSocket.cpp
+++ b/src/TcpSocket.cpp
@@ -55,6 +55,14 @@ TcpSocket::TcpSocket(int port, const string& name) :
throw std::runtime_error("Can't reuse address");
}
+#if defined(HAVE_SO_NOSIGPIPE)
+ int val = 1;
+ if (setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, &val, sizeof(val))
+ == SOCKET_ERROR) {
+ throw std::runtime_error("Can't set SO_NOSIGPIPE");
+ }
+#endif
+
m_own_address.setAddress(name);
m_own_address.setPort(port);
@@ -152,8 +160,15 @@ ssize_t TcpSocket::send(const void* data, size_t size, int timeout_ms)
}
}
- /* Without MSG_NOSIGNAL the process would receive a SIGPIPE and die */
- ssize_t ret = ::send(m_sock, (const char*)data, size, MSG_NOSIGNAL);
+ /* On Linux, the MSG_NOSIGNAL flag ensures that the process would not
+ * receive a SIGPIPE and die.
+ * Other systems have SO_NOSIGPIPE set on the socket for the same effect. */
+#if defined(HAVE_MSG_NOSIGNAL)
+ const int flags = MSG_NOSIGNAL;
+#else
+ const int flags = 0;
+#endif
+ ssize_t ret = ::send(m_sock, (const char*)data, size, flags);
if (ret == SOCKET_ERROR) {
stringstream ss;