| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- #ifndef HW_SOCKET_H_
- #define HW_SOCKET_H_
- #include "hplatform.h"
- #include "hdef.h"
- #ifdef _MSC_VER
- #pragma comment(lib, "ws2_32.lib")
- #endif
- BEGIN_EXTERN_C
- // socket -> setsockopt -> bind -> listen
- // @return sockfd
- int Listen(int port);
- // gethostbyname -> socket -> nonblocking -> connect
- // @return sockfd
- int Connect(const char* host, int port, int nonblock DEFAULT(0));
- #ifdef OS_WIN
- typedef int socklen_t;
- static inline int blocking(int sockfd) {
- unsigned long nb = 0;
- return ioctlsocket(sockfd, FIONBIO, &nb);
- }
- static inline int nonblocking(int sockfd) {
- unsigned long nb = 1;
- return ioctlsocket(sockfd, FIONBIO, &nb);
- }
- #define poll WSAPoll
- #define sockerrno WSAGetLastError()
- #define NIO_EAGAIN WSAEWOULDBLOCK
- #else
- #define blocking(s) fcntl(s, F_SETFL, fcntl(s, F_GETFL) & ~O_NONBLOCK)
- #define nonblocking(s) fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK)
- #define closesocket close
- #define sockerrno errno
- #define NIO_EAGAIN EAGAIN
- #endif
- static inline int tcp_nodelay(int sockfd, int on DEFAULT(1)) {
- return setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (const char*)&on, sizeof(int));
- }
- static inline int tcp_nopush(int sockfd, int on DEFAULT(1)) {
- #ifdef TCP_NOPUSH
- return setsockopt(sockfd, IPPROTO_TCP, TCP_NOPUSH, (const char*)&on, sizeof(int));
- #elif defined(TCP_CORK)
- return setsockopt(sockfd, IPPROTO_TCP, TCP_CORK, (const char*)&on, sizeof(int));
- #else
- return -10;
- #endif
- }
- static inline int tcp_keepalive(int sockfd, int on DEFAULT(1), int delay DEFAULT(60)) {
- if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (const char*)&on, sizeof(int)) != 0) {
- return sockerrno;
- }
- #ifdef TCP_KEEPALIVE
- return setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPALIVE, (const char*)&delay, sizeof(int));
- #elif defined(TCP_KEEPIDLE)
- // TCP_KEEPIDLE => tcp_keepalive_time
- // TCP_KEEPCNT => tcp_keepalive_probes
- // TCP_KEEPINTVL => tcp_keepalive_intvl
- return setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, (const char*)&delay, sizeof(int));
- #endif
- }
- static inline int udp_broadcast(int sockfd, int on DEFAULT(1)) {
- return setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (const char*)&on, sizeof(int));
- }
- END_EXTERN_C
- #endif // HW_SOCKET_H_
|