diff --git a/src/ClassiCube.vcxproj b/src/ClassiCube.vcxproj index 0ab4d2c52..bd22d69a6 100644 --- a/src/ClassiCube.vcxproj +++ b/src/ClassiCube.vcxproj @@ -494,6 +494,7 @@ + diff --git a/src/ClassiCube.vcxproj.filters b/src/ClassiCube.vcxproj.filters index 8ce44dba7..d86d9b512 100644 --- a/src/ClassiCube.vcxproj.filters +++ b/src/ClassiCube.vcxproj.filters @@ -785,6 +785,9 @@ Source Files\2D + + Source Files\Launcher + diff --git a/src/Http_Worker.c b/src/Http_Worker.c index 817a01d87..0c2fe69f8 100644 --- a/src/Http_Worker.c +++ b/src/Http_Worker.c @@ -489,10 +489,13 @@ static cc_result HttpConnection_Open(struct HttpConnection* conn, const struct H /* TODO: Connect in parallel instead of serial, but that's a lot of work */ for (i = 0; i < numValidAddrs; i++) { - res = Socket_Connect(&conn->socket, &addrs[i], false); - if (!res) break; + res = Socket_Create(&conn->socket, &addrs[i], false); + if (res) { HttpConnection_Close(conn); continue; } - HttpConnection_Close(conn); + res = Socket_Connect(conn->socket, &addrs[i]); + if (res) { HttpConnection_Close(conn); continue; } + + break; /* Successful connection */ } if (res) return res; diff --git a/src/Platform.h b/src/Platform.h index 746c75264..3ada2642f 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -273,8 +273,10 @@ cc_result Socket_CheckWritable(cc_socket s, cc_bool* writable); /* Otherwise, attempts to resolve the input via DNS into one or more IP addresses */ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* addrs, int* numValidAddrs); -/* Allocates a new socket and then begins connecting to the given address */ -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking); +/* Allocates a new socket that is capable of connecting to the given address */ +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking); +/* Begins connecting to the given address */ +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr); /* Attempts to read data from the given socket */ /* NOTE: A closed socket may set modified to 0, but still return 'success' (i.e. 0) */ cc_result Socket_Read(cc_socket s, cc_uint8* data, cc_uint32 count, cc_uint32* modified); diff --git a/src/Platform_3DS.c b/src/Platform_3DS.c index f12373492..a62322246 100644 --- a/src/Platform_3DS.c +++ b/src/Platform_3DS.c @@ -309,19 +309,23 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return i == 0 ? ERR_INVALID_ARGUMENT : 0; } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { struct sockaddr* raw = (struct sockaddr*)addr->data; - int res; *s = socket(raw->sa_family, SOCK_STREAM, 0); // https://www.3dbrew.org/wiki/SOCU:socket if (*s == -1) return errno; - + if (nonblocking) { int flags = fcntl(*s, F_GETFL, 0); if (flags >= 0) fcntl(*s, F_SETFL, flags | O_NONBLOCK); } + return 0; +} - res = connect(*s, raw, addr->size); +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { + struct sockaddr* raw = (struct sockaddr*)addr->data; + + int res = connect(s, raw, addr->size); return res == -1 ? errno : 0; } diff --git a/src/Platform_Dreamcast.c b/src/Platform_Dreamcast.c index f1d95fa4e..636cd7d17 100644 --- a/src/Platform_Dreamcast.c +++ b/src/Platform_Dreamcast.c @@ -452,9 +452,8 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return i == 0 ? ERR_INVALID_ARGUMENT : 0; } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { struct sockaddr* raw = (struct sockaddr*)addr->data; - cc_result res; *s = socket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP); if (*s == -1) return errno; @@ -462,8 +461,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { if (nonblocking) { fcntl(*s, F_SETFL, O_NONBLOCK); } + return 0; +} - res = connect(*s, raw, addr->size); +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { + struct sockaddr* raw = (struct sockaddr*)addr->data; + + int res = connect(s, raw, addr->size); return res == -1 ? errno : 0; } diff --git a/src/Platform_GCWii.c b/src/Platform_GCWii.c index 450a5ffc1..21cdf3b47 100644 --- a/src/Platform_GCWii.c +++ b/src/Platform_GCWii.c @@ -417,9 +417,8 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return ParseHost(str, port, addrs, numValidAddrs); } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { struct sockaddr* raw = (struct sockaddr*)addr->data; - int res; *s = net_socket(raw->sa_family, SOCK_STREAM, 0); if (*s < 0) return *s; @@ -428,8 +427,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { int blocking_raw = -1; /* non-blocking mode */ net_ioctl(*s, FIONBIO, &blocking_raw); } + return 0; +} - res = net_connect(*s, raw, addr->size); +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { + struct sockaddr* raw = (struct sockaddr*)addr->data; + + int res = net_connect(s, raw, addr->size); return res < 0 ? res : 0; } diff --git a/src/Platform_MacClassic.c b/src/Platform_MacClassic.c index ed8f698e2..7b418ff6a 100644 --- a/src/Platform_MacClassic.c +++ b/src/Platform_MacClassic.c @@ -391,7 +391,11 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return ERR_NOT_SUPPORTED; } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { + return ERR_NOT_SUPPORTED; +} + +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { return ERR_NOT_SUPPORTED; } diff --git a/src/Platform_N64.c b/src/Platform_N64.c index 923ece947..3341ac563 100644 --- a/src/Platform_N64.c +++ b/src/Platform_N64.c @@ -215,7 +215,11 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return ERR_NOT_SUPPORTED; } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { + return ERR_NOT_SUPPORTED; +} + +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { return ERR_NOT_SUPPORTED; } diff --git a/src/Platform_NDS.c b/src/Platform_NDS.c index 459ac94f8..7fbb189a2 100644 --- a/src/Platform_NDS.c +++ b/src/Platform_NDS.c @@ -359,9 +359,8 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return ParseHost(str, port, addrs, numValidAddrs); } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { struct sockaddr* raw = (struct sockaddr*)addr->data; - int res; if (!net_supported) { *s = -1; return ERR_NO_NETWORKING; } *s = socket(raw->sa_family, SOCK_STREAM, 0); @@ -371,8 +370,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { int blocking_raw = 1; /* non-blocking mode */ ioctl(*s, FIONBIO, &blocking_raw); } + return 0; +} - res = connect(*s, raw, addr->size); +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { + struct sockaddr* raw = (struct sockaddr*)addr->data; + + int res = connect(s, raw, addr->size); return res < 0 ? errno : 0; } diff --git a/src/Platform_PS1.c b/src/Platform_PS1.c index b65d88c2d..ccc5028f0 100644 --- a/src/Platform_PS1.c +++ b/src/Platform_PS1.c @@ -198,7 +198,11 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return ERR_NOT_SUPPORTED; } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { + return ERR_NOT_SUPPORTED; +} + +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { return ERR_NOT_SUPPORTED; } diff --git a/src/Platform_PS2.c b/src/Platform_PS2.c index 9723c6fd4..3491dae86 100644 --- a/src/Platform_PS2.c +++ b/src/Platform_PS2.c @@ -512,20 +512,24 @@ static cc_result GetSocketError(cc_socket s) { return res; } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { struct sockaddr* raw = (struct sockaddr*)addr->data; - int res; *s = socket(raw->sa_family, SOCK_STREAM, 0); if (*s < 0) return *s; - + if (nonblocking) { int blocking_raw = -1; // non-blocking mode - //ioctlsocket(*s, FIONBIO, &blocking_raw); TODO doesn't work + //ioctlsocket(*s, FIONBIO, &blocking_raw); TODO doesn't work } + return 0; +} - res = connect(*s, raw, addr->size); - return res == -1 ? GetSocketError(*s) : 0; +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { + struct sockaddr* raw = (struct sockaddr*)addr->data; + + int res = connect(s, raw, addr->size); + return res == -1 ? GetSocketError(s) : 0; } cc_result Socket_Read(cc_socket s, cc_uint8* data, cc_uint32 count, cc_uint32* modified) { diff --git a/src/Platform_PS3.c b/src/Platform_PS3.c index e6261dc46..5d8d69ae4 100644 --- a/src/Platform_PS3.c +++ b/src/Platform_PS3.c @@ -374,20 +374,23 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return ParseHost(str, port, addrs, numValidAddrs); } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { struct sockaddr* raw = (struct sockaddr*)addr->data; - int res; - res = netSocket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP); - if (res < 0) return net_errno; - *s = res; + *s = netSocket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP); + if (*s < 0) return net_errno; if (nonblocking) { int on = 1; netSetSockOpt(*s, SOL_SOCKET, SO_NBIO, &on, sizeof(int)); } + return 0; +} - res = netConnect(*s, raw, addr->size); +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { + struct sockaddr* raw = (struct sockaddr*)addr->data; + + int res = netConnect(s, raw, addr->size); return res < 0 ? net_errno : 0; } diff --git a/src/Platform_PSP.c b/src/Platform_PSP.c index e57fb401f..605113f38 100644 --- a/src/Platform_PSP.c +++ b/src/Platform_PSP.c @@ -311,19 +311,23 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return 0; } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { struct sockaddr* raw = (struct sockaddr*)addr->data; - int res; *s = sceNetInetSocket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP); if (*s < 0) return sceNetInetGetErrno(); - + if (nonblocking) { int on = 1; sceNetInetSetsockopt(*s, SOL_SOCKET, SO_NONBLOCK, &on, sizeof(int)); } + return 0; +} - res = sceNetInetConnect(*s, raw, addr->size); +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { + struct sockaddr* raw = (struct sockaddr*)addr->data; + + int res = sceNetInetConnect(*s, raw, addr->size); return res < 0 ? sceNetInetGetErrno() : 0; } diff --git a/src/Platform_PSVita.c b/src/Platform_PSVita.c index a1897d08d..6d4e72e8c 100644 --- a/src/Platform_PSVita.c +++ b/src/Platform_PSVita.c @@ -294,19 +294,23 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return 0; } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { struct SceNetSockaddr* raw = (struct SceNetSockaddr*)addr->data; - int res; *s = sceNetSocket("CC socket", raw->sa_family, SCE_NET_SOCK_STREAM, SCE_NET_IPPROTO_TCP); if (*s < 0) return *s; - + if (nonblocking) { int on = 1; sceNetSetsockopt(*s, SCE_NET_SOL_SOCKET, SCE_NET_SO_NBIO, &on, sizeof(int)); } + return 0; +} - res = sceNetConnect(*s, raw, addr->size); +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { + struct SceNetSockaddr* raw = (struct SceNetSockaddr*)addr->data; + + int res = sceNetConnect(s, raw, addr->size); return res; } diff --git a/src/Platform_Posix.c b/src/Platform_Posix.c index b442f7720..edc5b3662 100644 --- a/src/Platform_Posix.c +++ b/src/Platform_Posix.c @@ -642,7 +642,7 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return ParseHost(str, port, addrs, numValidAddrs); } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { struct sockaddr* raw = (struct sockaddr*)addr->data; cc_result res; @@ -653,8 +653,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { int blocking_raw = -1; /* non-blocking mode */ ioctl(*s, FIONBIO, &blocking_raw); } + return 0; +} - res = connect(*s, raw, addr->size); +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { + struct sockaddr* raw = (struct sockaddr*)addr->data; + + int res = connect(s, raw, addr->size); return res == -1 ? errno : 0; } diff --git a/src/Platform_Saturn.c b/src/Platform_Saturn.c index d001cc548..1516c972d 100644 --- a/src/Platform_Saturn.c +++ b/src/Platform_Saturn.c @@ -193,7 +193,11 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return ERR_NOT_SUPPORTED; } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { + return ERR_NOT_SUPPORTED; +} + +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { return ERR_NOT_SUPPORTED; } diff --git a/src/Platform_Switch.c b/src/Platform_Switch.c index 72cb5ad7d..82b8d4fb9 100644 --- a/src/Platform_Switch.c +++ b/src/Platform_Switch.c @@ -418,9 +418,8 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return ParseHost(str, port, addrs, numValidAddrs); } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { struct sockaddr* raw = (struct sockaddr*)addr->data; - cc_result res; *s = socket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP); if (*s == -1) return errno; @@ -428,8 +427,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { if (nonblocking) { fcntl(*s, F_SETFL, O_NONBLOCK); } + return 0; +} - res = connect(*s, raw, addr->size); +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { + struct sockaddr* raw = (struct sockaddr*)addr->data; + + int res = connect(s, raw, addr->size); return res == -1 ? errno : 0; } diff --git a/src/Platform_Web.c b/src/Platform_Web.c index 3eee98ca0..4688b60fe 100644 --- a/src/Platform_Web.c +++ b/src/Platform_Web.c @@ -265,13 +265,16 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a extern int interop_SocketCreate(void); extern int interop_SocketConnect(int sock, const cc_uint8* host, int port); -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { - int res; - *s = interop_SocketCreate(); +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { + *s = interop_SocketCreate(); + return 0; +} + +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { /* size is used to store port number instead */ /* returned result is negative for error */ - res = -interop_SocketConnect(*s, addr->data, addr->size); + int res = -interop_SocketConnect(s, addr->data, addr->size); /* error returned when invalid address provided */ if (res == _EHOSTUNREACH) return ERR_INVALID_ARGUMENT; diff --git a/src/Platform_WiiU.c b/src/Platform_WiiU.c index 6f4e65e39..27759801b 100644 --- a/src/Platform_WiiU.c +++ b/src/Platform_WiiU.c @@ -355,9 +355,8 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return ParseHost(str, port, addrs, numValidAddrs); } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { struct sockaddr* raw = (struct sockaddr*)addr->data; - cc_result res; *s = socket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP); if (*s == -1) return errno; @@ -366,8 +365,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { int blocking_raw = -1; /* non-blocking mode */ ioctl(*s, FIONBIO, &blocking_raw); } + return 0; +} - res = connect(*s, raw, addr->size); +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { + struct sockaddr* raw = (struct sockaddr*)addr->data; + + int res = connect(s, raw, addr->size); return res == -1 ? errno : 0; } diff --git a/src/Platform_Windows.c b/src/Platform_Windows.c index 5d3b556d4..0bce43a7c 100644 --- a/src/Platform_Windows.c +++ b/src/Platform_Windows.c @@ -607,7 +607,7 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a } } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { SOCKADDR* raw_addr = (SOCKADDR*)addr->data; cc_result res; @@ -618,8 +618,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { u_long blockingMode = -1; /* non-blocking mode */ _ioctlsocket(*s, FIONBIO, &blockingMode); } + return 0; +} - res = _connect(*s, raw_addr, addr->size); +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { + SOCKADDR* raw_addr = (SOCKADDR*)addr->data; + + int res = _connect(s, raw_addr, addr->size); return res == -1 ? _WSAGetLastError() : 0; } diff --git a/src/Platform_Xbox.c b/src/Platform_Xbox.c index aead23901..9066427f1 100644 --- a/src/Platform_Xbox.c +++ b/src/Platform_Xbox.c @@ -336,9 +336,8 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return i == 0 ? ERR_INVALID_ARGUMENT : 0; } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { struct sockaddr* raw = (struct sockaddr*)addr->data; - int res; *s = lwip_socket(raw->sa_family, SOCK_STREAM, 0); if (*s == -1) return errno; @@ -347,8 +346,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { int blocking_raw = -1; /* non-blocking mode */ lwip_ioctl(*s, FIONBIO, &blocking_raw); } + return 0; +} - res = lwip_connect(*s, raw, addr->size); +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { + struct sockaddr* raw = (struct sockaddr*)addr->data; + + int res = lwip_connect(s, raw, addr->size); return res == -1 ? errno : 0; } diff --git a/src/Platform_Xbox360.c b/src/Platform_Xbox360.c index 2d908dc94..bac9afe1f 100644 --- a/src/Platform_Xbox360.c +++ b/src/Platform_Xbox360.c @@ -232,7 +232,11 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a return ERR_NOT_SUPPORTED; } -cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { +cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) { + return ERR_NOT_SUPPORTED; +} + +cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) { return ERR_NOT_SUPPORTED; } diff --git a/src/Server.c b/src/Server.c index 27a8383a6..212727714 100644 --- a/src/Server.c +++ b/src/Server.c @@ -315,10 +315,11 @@ static void MPConnection_BeginConnect(void) { MPConnection_FailConnect(res); return; } - res = Socket_Connect(&net_socket, &addrs[0], true); - if (res == ERR_INVALID_ARGUMENT) { - MPConnection_Fail(&invalid_reason); - } else if (res && res != ReturnCode_SocketInProgess && res != ReturnCode_SocketWouldBlock) { + res = Socket_Create(&net_socket, &addrs[0], true); + if (res) { MPConnection_FailConnect(res); return; } + res = Socket_Connect(net_socket, &addrs[0]); + + if (res && res != ReturnCode_SocketInProgess && res != ReturnCode_SocketWouldBlock) { MPConnection_FailConnect(res); } else { Server.Disconnected = false;