- windows
int SSO_SetSocketOption(SOCKET sock, int level, int name, LPVOID val, int len)
{
return setsockopt(sock, level, name, (CHAR*)val, len);
}
int SSO_GetSocketOption(SOCKET sock, int level, int name, LPVOID val, int* len)
{
return getsockopt(sock, level, name, (CHAR*)val, len);
}
int SSO_IoctlSocket(SOCKET sock, long cmd, u_long* arg)
{
return ioctlsocket(sock, cmd, arg);
}
int SSO_WSAIoctl(SOCKET sock, DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer, LPDWORD lpcbBytesReturned)
{
return ::WSAIoctl(sock, dwIoControlCode, lpvInBuffer, cbInBuffer, lpvOutBuffer, cbOutBuffer, lpcbBytesReturned, nullptr, nullptr);
}
int SSO_UpdateAcceptContext(SOCKET soClient, SOCKET soBind)
{
return setsockopt(soClient, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, (CHAR*)&soBind, sizeof(SOCKET));
}
int SSO_UpdateConnectContext(SOCKET soClient, int iOption)
{
return setsockopt(soClient, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, (CHAR*)&iOption, sizeof(int));
}
int SSO_NoBlock(SOCKET sock, BOOL bNoBlock)
{
return ioctlsocket(sock, FIONBIO, (ULONG*)&bNoBlock);
}
int SSO_NoDelay(SOCKET sock, BOOL bNoDelay)
{
return setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (CHAR*)&bNoDelay, sizeof(BOOL));
}
int SSO_DontLinger(SOCKET sock, BOOL bDont)
{
return setsockopt(sock, SOL_SOCKET, SO_DONTLINGER, (CHAR*)&bDont, sizeof(BOOL));
}
int SSO_Linger(SOCKET sock, USHORT l_onoff, USHORT l_linger)
{
linger ln = {l_onoff, l_linger};
return setsockopt(sock, SOL_SOCKET, SO_LINGER, (CHAR*)&ln, sizeof(linger));
}
int SSO_KeepAlive(SOCKET sock, BOOL bKeepAlive)
{
return setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (CHAR*)&bKeepAlive, sizeof(BOOL));
}
int SSO_KeepAliveVals(SOCKET sock, u_long onoff, u_long time, u_long interval)
{
int result = NO_ERROR;
tcp_keepalive in = {onoff, time, interval};
DWORD dwBytes;
if(::WSAIoctl (
sock,
SIO_KEEPALIVE_VALS,
(LPVOID)&in,
sizeof(in),
nullptr,
0,
&dwBytes,
nullptr,
nullptr
) == SOCKET_ERROR)
{
result = ::WSAGetLastError();
if(result == WSAEWOULDBLOCK)
result = NO_ERROR;
}
return result;
}
int SSO_RecvBuffSize(SOCKET sock, int size)
{
return setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (CHAR*)&size, sizeof(int));
}
int SSO_SendBuffSize(SOCKET sock, int size)
{
return setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (CHAR*)&size, sizeof(int));
}
int SSO_ReuseAddress(SOCKET sock, BOOL bReuse)
{
return setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (CHAR*)&bReuse, sizeof(BOOL));
}
int SSO_UDP_ConnReset(SOCKET sock, BOOL bNewBehavior)
{
int result = NO_ERROR;
DWORD dwBytes;
if(::WSAIoctl (
sock,
SIO_UDP_CONNRESET,
(LPVOID)&bNewBehavior,
sizeof(bNewBehavior),
nullptr,
0,
&dwBytes,
nullptr,
nullptr
) == SOCKET_ERROR)
{
result = ::WSAGetLastError();
if(result == WSAEWOULDBLOCK)
result = NO_ERROR;
}
return result;
}
- linux
template <typename T>
bool IS_NO_ERROR(T v)
{
return v == (T)NO_ERROR;
}
BOOL fcntl_SETFL(FD fd, INT fl, BOOL bSet)
{
int val = fcntl(fd, F_GETFL);
if(IS_HAS_ERROR(val))
return FALSE;
val = bSet ? (val | fl) : (val & (~fl));
return IS_NO_ERROR(fcntl(fd, F_SETFL , val));
}
int SSO_SetSocketOption(SOCKET sock, int level, int name, LPVOID val, int len)
{
return setsockopt(sock, level, name, val, (socklen_t)len);
}
int SSO_GetSocketOption(SOCKET sock, int level, int name, LPVOID val, int* len)
{
return getsockopt(sock, level, name, val, (socklen_t*)len);
}
int SSO_IoctlSocket(SOCKET sock, long cmd, PVOID arg)
{
return ioctl(sock, cmd, arg);
}
int SSO_NoBlock(SOCKET sock, BOOL bNoBlock)
{
return fcntl_SETFL(sock, O_NONBLOCK, bNoBlock) ? NO_ERROR : SOCKET_ERROR;
}
int SSO_NoDelay(SOCKET sock, BOOL bNoDelay)
{
int val = bNoDelay ? 1 : 0;
return setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(int));
}
int SSO_DontLinger(SOCKET sock, BOOL bDont)
{
return SSO_Linger(sock, 0, 0);
}
int SSO_Linger(SOCKET sock, int l_onoff, int l_linger)
{
linger ln = {l_onoff, l_linger};
return setsockopt(sock, SOL_SOCKET, SO_LINGER, &ln, sizeof(linger));
}
int SSO_KeepAlive(SOCKET sock, BOOL bKeepAlive)
{
int val = bKeepAlive ? 1 : 0;
return setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(int));
}
int SSO_KeepAliveVals(SOCKET sock, BOOL bOnOff, DWORD dwIdle, DWORD dwInterval, DWORD dwCount)
{
if(bOnOff)
{
dwIdle /= 1000;
dwInterval /= 1000;
if(dwIdle == 0 || dwInterval == 0 || dwCount == 0)
{
::WSASetLastError(EINVAL);
return SOCKET_ERROR;
}
}
BOOL isOK = IS_NO_ERROR(SSO_KeepAlive(sock, bOnOff));
if(isOK && bOnOff)
{
isOK &= IS_NO_ERROR(setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, &dwIdle, sizeof(DWORD)));
isOK &= IS_NO_ERROR(setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, &dwInterval, sizeof(DWORD)));
isOK &= IS_NO_ERROR(setsockopt(sock, SOL_TCP, TCP_KEEPCNT, &dwCount, sizeof(DWORD)));
}
return isOK ? NO_ERROR : SOCKET_ERROR;
}
int SSO_ReuseAddress(SOCKET sock, BOOL bReuse)
{
int val = bReuse ? 1 : 0;
return setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(int));
}
int SSO_RecvBuffSize(SOCKET sock, int size)
{
return setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &size, sizeof(int));
}
int SSO_SendBuffSize(SOCKET sock, int size)
{
return setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &size, sizeof(int));
}
int SSO_RecvTimeout(SOCKET sock, int sec, int microsec)
{
timeval tv = {sec, microsec};
return setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(timeval));
}
int SSO_SendTimeout(SOCKET sock, int sec, int microsec)
{
timeval tv = {sec, microsec};
return setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(timeval));
}
int SSO_GetError(SOCKET sock)
{
int e;
socklen_t len = sizeof(e);
if(IS_NO_ERROR(getsockopt(sock, SOL_SOCKET, SO_ERROR, &e, &len)))
return e;
return SOCKET_ERROR;
}