mirror of
https://github.com/moonlight-stream/moonlight-common-c.git
synced 2025-08-18 09:25:49 +00:00
FIONBIO is not supported under NaCl so only use non-blocking connect if available
This commit is contained in:
parent
1662ce1ee8
commit
1bb1e47e8a
@ -114,9 +114,9 @@ SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen,
|
|||||||
SOCKET s;
|
SOCKET s;
|
||||||
struct sockaddr_in6 addr;
|
struct sockaddr_in6 addr;
|
||||||
int err;
|
int err;
|
||||||
|
#if defined(LC_DARWIN) || defined(FIONBIO)
|
||||||
int val;
|
int val;
|
||||||
struct fd_set writefds, exceptfds;
|
#endif
|
||||||
struct timeval tv;
|
|
||||||
|
|
||||||
s = socket(dstaddr->ss_family, SOCK_STREAM, IPPROTO_TCP);
|
s = socket(dstaddr->ss_family, SOCK_STREAM, IPPROTO_TCP);
|
||||||
if (s == INVALID_SOCKET) {
|
if (s == INVALID_SOCKET) {
|
||||||
@ -130,14 +130,23 @@ 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;
|
val = 1;
|
||||||
ioctlsocket(s, FIONBIO, &val);
|
ioctlsocket(s, FIONBIO, &val);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Start async connection
|
// Start connection
|
||||||
memcpy(&addr, dstaddr, sizeof(addr));
|
memcpy(&addr, dstaddr, sizeof(addr));
|
||||||
addr.sin6_port = htons(port);
|
addr.sin6_port = htons(port);
|
||||||
connect(s, (struct sockaddr*) &addr, addrlen);
|
if (connect(s, (struct sockaddr*) &addr, addrlen) < 0) {
|
||||||
|
err = (int)LastSocketError();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef FIONBIO
|
||||||
|
{
|
||||||
|
struct fd_set writefds, exceptfds;
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
FD_ZERO(&writefds);
|
FD_ZERO(&writefds);
|
||||||
FD_ZERO(&exceptfds);
|
FD_ZERO(&exceptfds);
|
||||||
@ -173,17 +182,23 @@ SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen,
|
|||||||
SOCKADDR_LEN len = sizeof(err);
|
SOCKADDR_LEN len = sizeof(err);
|
||||||
getsockopt(s, SOL_SOCKET, SO_ERROR, (char*)&err, &len);
|
getsockopt(s, SOL_SOCKET, SO_ERROR, (char*)&err, &len);
|
||||||
if (err != 0 || FD_ISSET(s, &exceptfds)) {
|
if (err != 0 || FD_ISSET(s, &exceptfds)) {
|
||||||
|
// Get the error code
|
||||||
err = (err != 0) ? err : LastSocketFail();
|
err = (err != 0) ? err : LastSocketFail();
|
||||||
Limelog("connect() failed: %d\n", err);
|
|
||||||
closeSocket(s);
|
|
||||||
SetLastSocketError(err);
|
|
||||||
return INVALID_SOCKET;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable non-blocking I/O now that the connection is established
|
// Disable non-blocking I/O now that the connection is established
|
||||||
val = 0;
|
val = 0;
|
||||||
ioctlsocket(s, FIONBIO, &val);
|
ioctlsocket(s, FIONBIO, &val);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (err != 0) {
|
||||||
|
Limelog("connect() failed: %d\n", err);
|
||||||
|
closeSocket(s);
|
||||||
|
SetLastSocketError(err);
|
||||||
|
return INVALID_SOCKET;
|
||||||
|
}
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user