|
|
@ -52,6 +52,9 @@ typedef unsigned long in_addr_t;
|
|
|
|
# define ioctlsocket ioctl
|
|
|
|
# define ioctlsocket ioctl
|
|
|
|
# define closesocket close
|
|
|
|
# define closesocket close
|
|
|
|
# define GET_LAST_ERROR() (errno)
|
|
|
|
# define GET_LAST_ERROR() (errno)
|
|
|
|
|
|
|
|
# define SD_RECEIVE SHUT_RD
|
|
|
|
|
|
|
|
# define SD_SEND SHUT_WR
|
|
|
|
|
|
|
|
# define SD_BOTH SHUT_RDWR
|
|
|
|
/* Need this for FIONREAD on solaris */
|
|
|
|
/* Need this for FIONREAD on solaris */
|
|
|
|
# define BSD_COMP
|
|
|
|
# define BSD_COMP
|
|
|
|
|
|
|
|
|
|
|
@ -92,6 +95,9 @@ typedef unsigned long in_addr_t;
|
|
|
|
# define ioctlsocket ioctl
|
|
|
|
# define ioctlsocket ioctl
|
|
|
|
# define closesocket close
|
|
|
|
# define closesocket close
|
|
|
|
# define GET_LAST_ERROR() (sock_errno())
|
|
|
|
# define GET_LAST_ERROR() (sock_errno())
|
|
|
|
|
|
|
|
# define SD_RECEIVE SHUT_RD
|
|
|
|
|
|
|
|
# define SD_SEND SHUT_WR
|
|
|
|
|
|
|
|
# define SD_BOTH SHUT_RDWR
|
|
|
|
|
|
|
|
|
|
|
|
/* Includes needed for OS/2 systems */
|
|
|
|
/* Includes needed for OS/2 systems */
|
|
|
|
# include <types.h>
|
|
|
|
# include <types.h>
|
|
|
@ -156,6 +162,21 @@ static inline bool SetNonBlocking(SOCKET d)
|
|
|
|
return ioctlsocket(d, FIONBIO, &nonblocking) == 0;
|
|
|
|
return ioctlsocket(d, FIONBIO, &nonblocking) == 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Try to set the socket into blocking mode.
|
|
|
|
|
|
|
|
* @param d The socket to set the blocking more for.
|
|
|
|
|
|
|
|
* @return True if setting the blocking mode succeeded, otherwise false.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
static inline bool SetBlocking(SOCKET d)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
|
|
|
u_long nonblocking = 0;
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
int nonblocking = 0;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return ioctlsocket(d, FIONBIO, &nonblocking) == 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Try to set the socket to not delay sending.
|
|
|
|
* Try to set the socket to not delay sending.
|
|
|
|
* @param d The socket to disable the delaying for.
|
|
|
|
* @param d The socket to disable the delaying for.
|
|
|
@ -169,6 +190,32 @@ static inline bool SetNoDelay(SOCKET d)
|
|
|
|
return setsockopt(d, IPPROTO_TCP, TCP_NODELAY, (const char*)&b, sizeof(b)) == 0;
|
|
|
|
return setsockopt(d, IPPROTO_TCP, TCP_NODELAY, (const char*)&b, sizeof(b)) == 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Try to shutdown the socket in one or both directions.
|
|
|
|
|
|
|
|
* @param d The socket to disable the delaying for.
|
|
|
|
|
|
|
|
* @param read Whether to shutdown the read direction.
|
|
|
|
|
|
|
|
* @param write Whether to shutdown the write direction.
|
|
|
|
|
|
|
|
* @param linger_timeout The socket linger timeout.
|
|
|
|
|
|
|
|
* @return True if successful
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
static inline bool ShutdownSocket(SOCKET d, bool read, bool write, uint linger_timeout)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (!read && !write) return true;
|
|
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
|
|
|
LINGER ln = { 1U, (uint16) linger_timeout };
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
struct linger ln = { 1, (int) linger_timeout };
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setsockopt(d, SOL_SOCKET, SO_LINGER, (const char*)&ln, sizeof(ln));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int how = SD_BOTH;
|
|
|
|
|
|
|
|
if (!read) how = SD_SEND;
|
|
|
|
|
|
|
|
if (!write) how = SD_RECEIVE;
|
|
|
|
|
|
|
|
return shutdown(d, how) == 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Make sure these structures have the size we expect them to be */
|
|
|
|
/* Make sure these structures have the size we expect them to be */
|
|
|
|
assert_compile(sizeof(in_addr) == 4); ///< IPv4 addresses should be 4 bytes.
|
|
|
|
assert_compile(sizeof(in_addr) == 4); ///< IPv4 addresses should be 4 bytes.
|
|
|
|
assert_compile(sizeof(in6_addr) == 16); ///< IPv6 addresses should be 16 bytes.
|
|
|
|
assert_compile(sizeof(in6_addr) == 16); ///< IPv6 addresses should be 16 bytes.
|
|
|
|