hsocket.h 1.9 KB

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