diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/TcpSocket.cpp | 19 |
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; |