knightonline/server/shared/SocketOpsLinux.cpp

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
}