81 lines
1.6 KiB
C++
81 lines
1.6 KiB
C++
#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
|
|
} |