hsocket.h 2.0 KB

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