hsocket.h 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #ifndef HW_SOCKET_H_
  2. #define HW_SOCKET_H_
  3. #include "hplatform.h"
  4. #include "hdef.h"
  5. #ifdef _MSC_VER
  6. #pragma comment(lib, "ws2_32.lib")
  7. #endif
  8. BEGIN_EXTERN_C
  9. // socket -> setsockopt -> bind -> listen
  10. // @return sockfd
  11. int Listen(int port);
  12. // gethostbyname -> socket -> nonblocking -> connect
  13. // @return sockfd
  14. int Connect(const char* host, int port, int nonblock DEFAULT(0));
  15. #ifdef OS_WIN
  16. typedef int socklen_t;
  17. static inline int blocking(int sockfd) {
  18. unsigned long nb = 0;
  19. return ioctlsocket(sockfd, FIONBIO, &nb);
  20. }
  21. static inline int nonblocking(int sockfd) {
  22. unsigned long nb = 1;
  23. return ioctlsocket(sockfd, FIONBIO, &nb);
  24. }
  25. #define poll WSAPoll
  26. #define sockerrno WSAGetLastError()
  27. #define NIO_EAGAIN WSAEWOULDBLOCK
  28. #else
  29. #define blocking(s) fcntl(s, F_SETFL, fcntl(s, F_GETFL) & ~O_NONBLOCK)
  30. #define nonblocking(s) fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK)
  31. #define closesocket close
  32. #define sockerrno errno
  33. #define NIO_EAGAIN EAGAIN
  34. #endif
  35. static inline int tcp_nodelay(int sockfd, int on DEFAULT(1)) {
  36. return setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (const char*)&on, sizeof(int));
  37. }
  38. static inline int tcp_nopush(int sockfd, int on DEFAULT(1)) {
  39. #ifdef TCP_NOPUSH
  40. return setsockopt(sockfd, IPPROTO_TCP, TCP_NOPUSH, (const char*)&on, sizeof(int));
  41. #elif defined(TCP_CORK)
  42. return setsockopt(sockfd, IPPROTO_TCP, TCP_CORK, (const char*)&on, sizeof(int));
  43. #else
  44. return -10;
  45. #endif
  46. }
  47. static inline int tcp_keepalive(int sockfd, int on DEFAULT(1), int delay DEFAULT(60)) {
  48. if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (const char*)&on, sizeof(int)) != 0) {
  49. return sockerrno;
  50. }
  51. #ifdef TCP_KEEPALIVE
  52. return setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPALIVE, (const char*)&delay, sizeof(int));
  53. #elif defined(TCP_KEEPIDLE)
  54. // TCP_KEEPIDLE => tcp_keepalive_time
  55. // TCP_KEEPCNT => tcp_keepalive_probes
  56. // TCP_KEEPINTVL => tcp_keepalive_intvl
  57. return setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, (const char*)&delay, sizeof(int));
  58. #endif
  59. }
  60. static inline int udp_broadcast(int sockfd, int on DEFAULT(1)) {
  61. return setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (const char*)&on, sizeof(int));
  62. }
  63. END_EXTERN_C
  64. #endif // HW_SOCKET_H_