hsocket.h 2.1 KB

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