Add platform helper function to set socket non-blocking mode

This commit is contained in:
Cameron Gutman
2019-11-02 19:16:46 -07:00
parent 9bd301897a
commit 197594f38c
2 changed files with 15 additions and 11 deletions
+13 -10
View File
@@ -177,11 +177,20 @@ SOCKET bindUdpSocket(int addrfamily, int bufferSize) {
return s; 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 connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, unsigned short port, int timeoutSec) {
SOCKET s; SOCKET s;
struct sockaddr_in6 addr; struct sockaddr_in6 addr;
int err; int err;
#if defined(LC_DARWIN) || defined(FIONBIO) int nonBlocking;
#ifdef LC_DARWIN
int val; int val;
#endif #endif
@@ -197,11 +206,8 @@ SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen,
setsockopt(s, SOL_SOCKET, SO_NOSIGPIPE, (char*)&val, sizeof(val)); setsockopt(s, SOL_SOCKET, SO_NOSIGPIPE, (char*)&val, sizeof(val));
#endif #endif
#ifdef FIONBIO
// Enable non-blocking I/O for connect timeout support // Enable non-blocking I/O for connect timeout support
val = 1; nonBlocking = setSocketNonBlocking(s, 1) == 0;
ioctlsocket(s, FIONBIO, &val);
#endif
// Start connection // Start connection
memcpy(&addr, dstaddr, addrlen); memcpy(&addr, dstaddr, addrlen);
@@ -211,8 +217,7 @@ SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen,
err = (int)LastSocketError(); err = (int)LastSocketError();
} }
#ifdef FIONBIO if (nonBlocking) {
{
fd_set writefds, exceptfds; fd_set writefds, exceptfds;
struct timeval tv; 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 // Disable non-blocking I/O now that the connection is established
val = 0; setSocketNonBlocking(s, 0);
ioctlsocket(s, FIONBIO, &val);
} }
#endif
if (err != 0) { if (err != 0) {
Limelog("connect() failed: %d\n", err); Limelog("connect() failed: %d\n", err);
+2 -1
View File
@@ -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 connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, unsigned short port, int timeoutSec);
SOCKET bindUdpSocket(int addrfamily, int bufferSize); SOCKET bindUdpSocket(int addrfamily, int bufferSize);
int enableNoDelay(SOCKET s); int enableNoDelay(SOCKET s);
int setSocketNonBlocking(SOCKET s, int val);
int recvUdpSocket(SOCKET s, char* buffer, int size, int useSelect); int recvUdpSocket(SOCKET s, char* buffer, int size, int useSelect);
void shutdownTcpSocket(SOCKET s); void shutdownTcpSocket(SOCKET s);
int setNonFatalRecvTimeoutMs(SOCKET s, int timeoutMs); int setNonFatalRecvTimeoutMs(SOCKET s, int timeoutMs);
@@ -58,4 +59,4 @@ void closeSocket(SOCKET s);
int isPrivateNetworkAddress(struct sockaddr_storage* address); int isPrivateNetworkAddress(struct sockaddr_storage* address);
int initializePlatformSockets(void); int initializePlatformSockets(void);
void cleanupPlatformSockets(void); void cleanupPlatformSockets(void);