Patch to handle SIGPIPE in send(). SIGPIPE behavior is not consistent even across *ix platforms. Linux has MSG_NOSIGNAL and Mac supports SO_NOSIGPIPE. Best option is to set SIG_IGN, but it's more of an application setting. We should document this.
diff --git a/src/tcp_connecter.cpp b/src/tcp_connecter.cpp index 3c82d32..e0cc760 100644 --- a/src/tcp_connecter.cpp +++ b/src/tcp_connecter.cpp @@ -206,6 +206,13 @@ int zmq::tcp_connecter_t::open () errno_assert (rc != SOCKET_ERROR); #endif +#ifdef SO_NOSIGPIPE + flag = 1; + rc = setsockopt (s, SOL_SOCKET, SO_NOSIGPIPE, (char *) &flag, + sizeof (int)); + errno_assert (rc != -1); +#endif + // Connect to the remote peer. rc = ::connect (s, (struct sockaddr*) &addr, addr_len); @@ -242,6 +249,13 @@ int zmq::tcp_connecter_t::open () int rc = fcntl (s, F_SETFL, flag | O_NONBLOCK); errno_assert (rc != -1); +#ifdef SO_NOSIGPIPE + flag = 1; + rc = setsockopt (s, SOL_SOCKET, SO_NOSIGPIPE, (char *) &flag, + sizeof (int)); + errno_assert (rc != -1); +#endif + // Connect to the remote peer. rc = ::connect (s, (struct sockaddr*) &addr, sizeof (sockaddr_un)); diff --git a/src/tcp_listener.cpp b/src/tcp_listener.cpp index a62bc04..c6dfee6 100644 --- a/src/tcp_listener.cpp +++ b/src/tcp_listener.cpp @@ -328,6 +328,13 @@ zmq::fd_t zmq::tcp_listener_t::accept () errno_assert (rc != -1); #endif +#ifdef SO_NOSIGPIPE + flags = 1; + rc = setsockopt (sock, SOL_SOCKET, SO_NOSIGPIPE, (char *) &flags, + sizeof (int)); + errno_assert (rc != -1); +#endif + struct sockaddr *sa = (struct sockaddr*) &addr; if (AF_UNIX != sa->sa_family) { @@ -335,7 +342,7 @@ zmq::fd_t zmq::tcp_listener_t::accept () int flag = 1; rc = setsockopt (sock, IPPROTO_TCP, TCP_NODELAY, (char*) &flag, sizeof (int)); - errno_assert (rc == 0); + errno_assert (rc != -1); #ifdef ZMQ_HAVE_OPENVMS // Disable delayed acknowledgements. diff --git a/src/tcp_socket.cpp b/src/tcp_socket.cpp index cc426d7..6fb537a 100644 --- a/src/tcp_socket.cpp +++ b/src/tcp_socket.cpp @@ -181,7 +181,13 @@ zmq::fd_t zmq::tcp_socket_t::get_fd () int zmq::tcp_socket_t::write (const void *data, int size) { - ssize_t nbytes = send (s, data, size, 0); +#if defined ZMQ_HAVE_LINUX && defined MSG_NOSIGNAL + int flags = MSG_NOSIGNAL; +#else + int flags = 0; +#endif + + ssize_t nbytes = ::send (s, data, size, flags); // Several errors are OK. When speculative write is being done we may not // be able to write a single byte to the socket. Also, SIGSTOP issued @@ -200,7 +206,7 @@ int zmq::tcp_socket_t::write (const void *data, int size) int zmq::tcp_socket_t::read (void *data, int size) { - ssize_t nbytes = recv (s, data, size, 0); + ssize_t nbytes = ::recv (s, data, size, 0); // Several errors are OK. When speculative read is being done we may not // be able to read a single byte to the socket. Also, SIGSTOP issued
_______________________________________________ zeromq-dev mailing list zeromq-dev@lists.zeromq.org http://lists.zeromq.org/mailman/listinfo/zeromq-dev