#ifdef __linux #include #include #include #elif _WIN32 #define WIN32_LEAN_AND_MEAN #include #include #endif #include int open_socket(int af, int type, int protocol) { #ifdef __linux return socket(af, type, protocol); #elif _WIN32 WSADATA wsaData = {0}; int iResult = 0; // Initialize Winsock iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { printf("WSAStartup failed: %d\n", iResult); return 1; } return socket(af, type, protocol); #endif } void close_socket(int sock) { if (sock < 0) { return; } #ifdef __linux close(sock); #elif _WIN32 closesocket(sock); WSACleanup(); #endif } int set_socket_option(int socket, int level, int optname, const char* optval, int optlen) { #ifdef __linux return setsockopt(socket, level, optname, optval, optlen); #elif _WIN32 int ret = setsockopt(socket, level, optname, optval, optlen); if (ret < 0) { int err = WSAGetLastError(); printf("Failed to setsockopt - Err: %d\n", err); } return ret; #endif } int set_socket_timeout(int socket, int microSeconds) { #ifdef __linux timeval timeout = {}; timeout.tv_sec = 0; timeout.tv_usec = microSeconds; #elif _WIN32 unsigned long timeout = microSeconds / 1000; // milliseconds #endif return set_socket_option(socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)); } int write_to_socket(int socket, const char* buf, int len) { #ifdef __linux return write(socket, buf, len); #elif _WIN32 return send(socket, buf, len, 0); #endif } int read_from_socket(int socket, char* buf, int len) { #ifdef __linux return read(socket, buf, len); #elif _WIN32 return recv(socket, buf, len, 0); #endif }