#include "stdafx.h" #include "SocketOps.h" namespace SocketOps { #ifdef _WIN32 // Windows implementation (existing) SOCKET CreateTCPFileDescriptor() { return WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); } bool Nonblocking(SOCKET fd) { unsigned long arg = 1; return (ioctlsocket(fd, FIONBIO, &arg) == 0); } bool Blocking(SOCKET fd) { unsigned long arg = 0; return (ioctlsocket(fd, FIONBIO, &arg) == 0); } bool DisableBuffering(SOCKET fd) { int arg = 1; return (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&arg, sizeof(int)) == 0); } bool EnableBuffering(SOCKET fd) { int arg = 0; return (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&arg, sizeof(int)) == 0); } void CloseSocket(SOCKET fd) { shutdown(fd, SD_BOTH); closesocket(fd); } #else // Linux implementation SOCKET CreateTCPFileDescriptor() { return socket(AF_INET, SOCK_STREAM, 0); } bool Nonblocking(SOCKET fd) { int flags = fcntl(fd, F_GETFL, 0); if (flags == -1) return false; return (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == 0); } bool Blocking(SOCKET fd) { int flags = fcntl(fd, F_GETFL, 0); if (flags == -1) return false; return (fcntl(fd, F_SETFL, flags & ~O_NONBLOCK) == 0); } bool DisableBuffering(SOCKET fd) { int arg = 1; return (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &arg, sizeof(int)) == 0); } bool EnableBuffering(SOCKET fd) { int arg = 0; return (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &arg, sizeof(int)) == 0); } void CloseSocket(SOCKET fd) { shutdown(fd, SHUT_RDWR); close(fd); } #endif }