mirror of
https://github.com/moonlight-stream/moonlight-common-c.git
synced 2026-06-17 06:11:03 +00:00
Add platform helper function to set socket non-blocking mode
This commit is contained in:
+13
-10
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user