Properly disable SIGPIPE on OSX network sockets.
Disable SO_NOSIGPIPE socket option when avaiable. Use MSG_NOSIGNAL send flag on systems that support it.
This commit is contained in:
parent
6e03236574
commit
4517db75b5
1 changed files with 9 additions and 8 deletions
|
@ -55,10 +55,6 @@
|
||||||
|
|
||||||
#include <netinet/tcp.h>
|
#include <netinet/tcp.h>
|
||||||
|
|
||||||
#if defined(__APPLE__)
|
|
||||||
#define MSG_NOSIGNAL SO_NOSIGPIPE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// BSD calls this flag IPV6_JOIN_GROUP
|
// BSD calls this flag IPV6_JOIN_GROUP
|
||||||
#if !defined(IPV6_ADD_MEMBERSHIP) && defined(IPV6_JOIN_GROUP)
|
#if !defined(IPV6_ADD_MEMBERSHIP) && defined(IPV6_JOIN_GROUP)
|
||||||
#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
|
#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
|
||||||
|
@ -87,10 +83,6 @@
|
||||||
#define SOCK_IOCTL ioctlsocket
|
#define SOCK_IOCTL ioctlsocket
|
||||||
#define SOCK_CLOSE closesocket
|
#define SOCK_CLOSE closesocket
|
||||||
|
|
||||||
// Windows doesn't have this flag
|
|
||||||
#ifndef MSG_NOSIGNAL
|
|
||||||
#define MSG_NOSIGNAL 0
|
|
||||||
#endif
|
|
||||||
// Workaround missing flag in MinGW
|
// Workaround missing flag in MinGW
|
||||||
#if defined(__MINGW32__) && !defined(SIO_UDP_NETRESET)
|
#if defined(__MINGW32__) && !defined(SIO_UDP_NETRESET)
|
||||||
#define SIO_UDP_NETRESET _WSAIOW(IOC_VENDOR, 15)
|
#define SIO_UDP_NETRESET _WSAIOW(IOC_VENDOR, 15)
|
||||||
|
@ -341,6 +333,13 @@ Error NetSocketPosix::open(Type p_sock_type, IP::Type &ip_type) {
|
||||||
print_verbose("Unable to turn off UDP WSAENETRESET behaviour on Windows");
|
print_verbose("Unable to turn off UDP WSAENETRESET behaviour on Windows");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(SO_NOSIGPIPE)
|
||||||
|
// Disable SIGPIPE (should only be relevant to stream sockets, but seems to affect UDP too on iOS)
|
||||||
|
int par = 1;
|
||||||
|
if (setsockopt(_sock, SOL_SOCKET, SO_NOSIGPIPE, SOCK_CBUF(&par), sizeof(int)) != 0) {
|
||||||
|
print_verbose("Unable to turn off SIGPIPE on socket");
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
@ -546,8 +545,10 @@ Error NetSocketPosix::send(const uint8_t *p_buffer, int p_len, int &r_sent) {
|
||||||
ERR_FAIL_COND_V(!is_open(), ERR_UNCONFIGURED);
|
ERR_FAIL_COND_V(!is_open(), ERR_UNCONFIGURED);
|
||||||
|
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
#ifdef MSG_NOSIGNAL
|
||||||
if (_is_stream)
|
if (_is_stream)
|
||||||
flags = MSG_NOSIGNAL;
|
flags = MSG_NOSIGNAL;
|
||||||
|
#endif
|
||||||
r_sent = ::send(_sock, SOCK_CBUF(p_buffer), p_len, flags);
|
r_sent = ::send(_sock, SOCK_CBUF(p_buffer), p_len, flags);
|
||||||
|
|
||||||
if (r_sent < 0) {
|
if (r_sent < 0) {
|
||||||
|
|
Loading…
Reference in a new issue