diff --git a/platform/linux/network/Socket.h b/platform/linux/network/Socket.h index c15a7ab..4d76f87 100755 --- a/platform/linux/network/Socket.h +++ b/platform/linux/network/Socket.h @@ -9,6 +9,18 @@ #ifndef COMS_PLATFORM_LINUX_NETWORK_SOCKET_H #define COMS_PLATFORM_LINUX_NETWORK_SOCKET_H -#define socket_close close +#include "../../../stdlib/Types.h" + +#include +#include +#include + +void socket_close(int32 sd) { + shutdown(sd, SHUT_RDWR); + close(sd); +} + +#define socket_prepare() ((void)0) +#define socket_cleanup() ((void)0) #endif \ No newline at end of file diff --git a/platform/win32/network/Server.h b/platform/win32/network/Server.h index 28dcb1a..c813e8f 100755 --- a/platform/win32/network/Server.h +++ b/platform/win32/network/Server.h @@ -21,27 +21,19 @@ #pragma comment(lib, "Ws2_32.lib") -void socket_server_udp_create(SocketConnection* con) { - WSADATA wsaData; - - // Initialize Winsock - if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { - return; - } - - // Create socket - con->sd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); - if (con->sd == INVALID_SOCKET) { - WSACleanup(); - return; - } - - // Set socket to non-blocking mode +void socket_non_blocking(SocketConnection* con) +{ u_long mode = 1; if (ioctlsocket(con->sd, FIONBIO, &mode) != NO_ERROR) { closesocket(con->sd); - WSACleanup(); - return; + } +} + +bool socket_server_udp_create(SocketConnection* con) { + // Create socket + con->sd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); + if (con->sd == INVALID_SOCKET) { + return false; } // Bind socket @@ -52,28 +44,62 @@ void socket_server_udp_create(SocketConnection* con) { if (bind(con->sd, (struct sockaddr *) &con->addr, sizeof(con->addr)) == SOCKET_ERROR) { closesocket(con->sd); - WSACleanup(); - return; + return false; } + + return true; +} + +bool socket_server_websocket_create(SocketConnection* con) { + con->sd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); + if (con->sd == INVALID_SOCKET) { + con->sd = 0; + return false; + } + + // Set non-blocking mode (Windows version) + unsigned long mode = 1; // 1 = non-blocking, 0 = blocking + if (ioctlsocket(con->sd, FIONBIO, &mode) != 0) { + closesocket(con->sd); + con->sd = 0; + return false; + } + + // Set SO_REUSEADDR + int opt = 1; + if (setsockopt(con->sd, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt)) == SOCKET_ERROR) { + closesocket(con->sd); + con->sd = 0; + return false; + } + + memset(&con->addr, 0, sizeof(con->addr)); + con->addr.sin6_family = AF_INET6; + con->addr.sin6_addr = in6addr_any; + con->addr.sin6_port = htons(con->port); + + if (bind(con->sd, (SOCKADDR*)&con->addr, sizeof(con->addr)) == SOCKET_ERROR) { + closesocket(con->sd); + con->sd = 0; + return false; + } + + if (listen(con->sd, SOMAXCONN) == SOCKET_ERROR) { + closesocket(con->sd); + con->sd = 0; + return false; + } + + return true; } bool socket_server_http_create(SocketConnection* con) { - WSADATA wsaData; - - // Initialize Winsock - if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { - return false; - } - - // Create socket con->sd = socket(AF_INET6, SOCK_STREAM, 0); if (con->sd == INVALID_SOCKET) { - WSACleanup(); return false; } - // Bind socket memset(&con->addr, 0, sizeof(con->addr)); con->addr.sin6_family = AF_INET6; con->addr.sin6_addr = in6addr_any; @@ -81,14 +107,11 @@ bool socket_server_http_create(SocketConnection* con) if (bind(con->sd, (struct sockaddr *) &con->addr, sizeof(con->addr)) == SOCKET_ERROR) { closesocket(con->sd); - WSACleanup(); return false; } - // Listen for incoming connections if (listen(con->sd, 5) < 0) { closesocket(con->sd); - WSACleanup(); return false; } diff --git a/platform/win32/network/Socket.h b/platform/win32/network/Socket.h index 6fa2e95..9e3ad3e 100755 --- a/platform/win32/network/Socket.h +++ b/platform/win32/network/Socket.h @@ -9,6 +9,21 @@ #ifndef COMS_PLATFORM_WIN32_NETWORK_SOCKET_H #define COMS_PLATFORM_WIN32_NETWORK_SOCKET_H -#define socket_close(sd) closesocket(sd); WSACleanup() +#include "../../../stdlib/Types.h" +#include +#include + +void socket_close(SOCKET sd) { + shutdown(sd, SD_BOTH); + closesocket(sd); +} + +#define socket_prepare() { \ + WSADATA wsa_data; \ + if (WSAStartup(MAKEWORD(2, 2), &wsa_data) != 0) { \ + return false; \ + } \ +} +#define socket_cleanup() WSACleanup() #endif \ No newline at end of file