hsocket.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. // @param cnt: ping count
  16. // @return: ok count
  17. // @note: printd $CC -DPRINT_DEBUG
  18. int Ping(const char* host, int cnt DEFAULT(4));
  19. #ifdef OS_WIN
  20. typedef int socklen_t;
  21. static inline int blocking(int sockfd) {
  22. unsigned long nb = 0;
  23. return ioctlsocket(sockfd, FIONBIO, &nb);
  24. }
  25. static inline int nonblocking(int sockfd) {
  26. unsigned long nb = 1;
  27. return ioctlsocket(sockfd, FIONBIO, &nb);
  28. }
  29. #define poll WSAPoll
  30. #define sockerrno WSAGetLastError()
  31. #define NIO_EAGAIN WSAEWOULDBLOCK
  32. #else
  33. #define blocking(s) fcntl(s, F_SETFL, fcntl(s, F_GETFL) & ~O_NONBLOCK)
  34. #define nonblocking(s) fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK)
  35. #define closesocket close
  36. #define sockerrno errno
  37. #define NIO_EAGAIN EAGAIN
  38. #endif
  39. static inline int tcp_nodelay(int sockfd, int on DEFAULT(1)) {
  40. return setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (const char*)&on, sizeof(int));
  41. }
  42. static inline int tcp_nopush(int sockfd, int on DEFAULT(1)) {
  43. #ifdef TCP_NOPUSH
  44. return setsockopt(sockfd, IPPROTO_TCP, TCP_NOPUSH, (const char*)&on, sizeof(int));
  45. #elif defined(TCP_CORK)
  46. return setsockopt(sockfd, IPPROTO_TCP, TCP_CORK, (const char*)&on, sizeof(int));
  47. #else
  48. return -10;
  49. #endif
  50. }
  51. static inline int tcp_keepalive(int sockfd, int on DEFAULT(1), int delay DEFAULT(60)) {
  52. if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (const char*)&on, sizeof(int)) != 0) {
  53. return sockerrno;
  54. }
  55. #ifdef TCP_KEEPALIVE
  56. return setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPALIVE, (const char*)&delay, sizeof(int));
  57. #elif defined(TCP_KEEPIDLE)
  58. // TCP_KEEPIDLE => tcp_keepalive_time
  59. // TCP_KEEPCNT => tcp_keepalive_probes
  60. // TCP_KEEPINTVL => tcp_keepalive_intvl
  61. return setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, (const char*)&delay, sizeof(int));
  62. #else
  63. return 0;
  64. #endif
  65. }
  66. static inline int udp_broadcast(int sockfd, int on DEFAULT(1)) {
  67. return setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (const char*)&on, sizeof(int));
  68. }
  69. // send timeout
  70. static inline int so_sndtimeo(int sockfd, int timeout) {
  71. #ifdef OS_WIN
  72. return setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeout, sizeof(int));
  73. #else
  74. struct timeval tv = {timeout/1000, (timeout%1000)*1000};
  75. return setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
  76. #endif
  77. }
  78. // recv timeout
  79. static inline int so_rcvtimeo(int sockfd, int timeout) {
  80. #ifdef OS_WIN
  81. return setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(int));
  82. #else
  83. struct timeval tv = {timeout/1000, (timeout%1000)*1000};
  84. return setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
  85. #endif
  86. }
  87. END_EXTERN_C
  88. #endif // HW_SOCKET_H_