From 197594f38cd480df7b158a0b8f29282fb1b0e384 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 2 Nov 2019 19:16:46 -0700 Subject: [PATCH] Add platform helper function to set socket non-blocking mode --- src/PlatformSockets.c | 23 +++++++++++++---------- src/PlatformSockets.h | 3 ++- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/PlatformSockets.c b/src/PlatformSockets.c index 810055b..4079e1b 100644 --- a/src/PlatformSockets.c +++ b/src/PlatformSockets.c @@ -177,11 +177,20 @@ SOCKET bindUdpSocket(int addrfamily, int bufferSize) { return s; } +int setSocketNonBlocking(SOCKET s, int val) { +#ifdef FIONBIO + return ioctlsocket(s, FIONBIO, &val); +#else + return SOCKET_ERROR; +#endif +} + SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, unsigned short port, int timeoutSec) { SOCKET s; struct sockaddr_in6 addr; int err; -#if defined(LC_DARWIN) || defined(FIONBIO) + int nonBlocking; +#ifdef LC_DARWIN int val; #endif @@ -197,11 +206,8 @@ SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, setsockopt(s, SOL_SOCKET, SO_NOSIGPIPE, (char*)&val, sizeof(val)); #endif -#ifdef FIONBIO // Enable non-blocking I/O for connect timeout support - val = 1; - ioctlsocket(s, FIONBIO, &val); -#endif + nonBlocking = setSocketNonBlocking(s, 1) == 0; // Start connection memcpy(&addr, dstaddr, addrlen); @@ -211,8 +217,7 @@ SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, err = (int)LastSocketError(); } -#ifdef FIONBIO - { + if (nonBlocking) { fd_set writefds, exceptfds; struct timeval tv; @@ -252,10 +257,8 @@ SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, } // Disable non-blocking I/O now that the connection is established - val = 0; - ioctlsocket(s, FIONBIO, &val); + setSocketNonBlocking(s, 0); } -#endif if (err != 0) { Limelog("connect() failed: %d\n", err); diff --git a/src/PlatformSockets.h b/src/PlatformSockets.h index e889c75..f10fc08 100644 --- a/src/PlatformSockets.h +++ b/src/PlatformSockets.h @@ -50,6 +50,7 @@ int resolveHostName(const char* host, int family, int tcpTestPort, struct sockad SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, unsigned short port, int timeoutSec); SOCKET bindUdpSocket(int addrfamily, int bufferSize); int enableNoDelay(SOCKET s); +int setSocketNonBlocking(SOCKET s, int val); int recvUdpSocket(SOCKET s, char* buffer, int size, int useSelect); void shutdownTcpSocket(SOCKET s); int setNonFatalRecvTimeoutMs(SOCKET s, int timeoutMs); @@ -58,4 +59,4 @@ void closeSocket(SOCKET s); int isPrivateNetworkAddress(struct sockaddr_storage* address); int initializePlatformSockets(void); -void cleanupPlatformSockets(void); \ No newline at end of file +void cleanupPlatformSockets(void);