hsocket.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. inline int blocking(int sockfd) {
  13. unsigned long nb = 0;
  14. return ioctlsocket(sockfd, FIONBIO, &nb);
  15. }
  16. inline int nonblocking(int sockfd) {
  17. unsigned long nb = 1;
  18. return ioctlsocket(sockfd, FIONBIO, &nb);
  19. }
  20. #define sockerrno WSAGetLastError()
  21. #define NIO_EAGAIN WSAEWOULDBLOCK
  22. #else
  23. #define blocking(s) fcntl(s, F_SETFL, fcntl(s, F_GETFL) & ~O_NONBLOCK)
  24. #define nonblocking(s) fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK)
  25. #define closesocket close
  26. #define sockerrno errno
  27. #define NIO_EAGAIN EAGAIN
  28. #endif
  29. inline int tcp_nodelay(int sockfd, int on = 1) {
  30. return setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (const char*)&on, sizeof(int));
  31. }
  32. inline int tcp_nopush(int sockfd, int on = 1) {
  33. #ifdef TCP_NOPUSH
  34. return setsockopt(sockfd, IPPROTO_TCP, TCP_NOPUSH, (const char*)&on, sizeof(int));
  35. #elif defined(TCP_CORK)
  36. return setsockopt(sockfd, IPPROTO_TCP, TCP_CORK, (const char*)&on, sizeof(int));
  37. #else
  38. return -10;
  39. #endif
  40. }
  41. inline int tcp_keepalive(int sockfd, int on = 1, int delay = 60) {
  42. if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (const char*)&on, sizeof(int)) != 0) {
  43. return sockerrno;
  44. }
  45. #ifdef TCP_KEEPALIVE
  46. return setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPALIVE, (const char*)&delay, sizeof(int));
  47. #elif defined(TCP_KEEPIDLE)
  48. // TCP_KEEPIDLE => tcp_keepalive_time
  49. // TCP_KEEPCNT => tcp_keepalive_probes
  50. // TCP_KEEPINTVL => tcp_keepalive_intvl
  51. return setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, (const char*)&delay, sizeof(int));
  52. #endif
  53. }
  54. inline int udp_broadcast(int sockfd, int on = 1) {
  55. return setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (const char*)&on, sizeof(int));
  56. }
  57. #endif // HW_SOCKET_H_