1
0

hsocket.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include "hsocket.h"
  2. int Listen(int port) {
  3. // socket -> setsockopt -> bind -> listen
  4. int listenfd = socket(AF_INET, SOCK_STREAM, 0);
  5. if (listenfd < 0) {
  6. perror("socket");
  7. return -10;
  8. }
  9. // note: SO_REUSEADDR means that you can reuse sockaddr of TIME_WAIT status
  10. int reuseaddr = 1;
  11. if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuseaddr, sizeof(int)) < 0) {
  12. perror("setsockopt");
  13. closesocket(listenfd);
  14. return -11;
  15. }
  16. struct sockaddr_in addr;
  17. socklen_t addrlen = sizeof(addr);
  18. memset(&addr, 0, addrlen);
  19. addr.sin_family = AF_INET;
  20. addr.sin_addr.s_addr = htonl(INADDR_ANY);
  21. addr.sin_port = htons(port);
  22. if (bind(listenfd, (struct sockaddr*)&addr, addrlen) < 0) {
  23. perror("bind");
  24. closesocket(listenfd);
  25. return -20;
  26. }
  27. if (listen(listenfd, SOMAXCONN) < 0) {
  28. perror("listen");
  29. closesocket(listenfd);
  30. return -30;
  31. }
  32. return listenfd;
  33. }
  34. int Connect(const char* host, int port, int nonblock) {
  35. // gethostbyname -> socket -> nonblocking -> connect
  36. struct sockaddr_in addr;
  37. socklen_t addrlen = sizeof(addr);
  38. memset(&addr, 0, addrlen);
  39. addr.sin_family = AF_INET;
  40. inet_pton(AF_INET, host, &addr.sin_addr);
  41. if (addr.sin_addr.s_addr == INADDR_NONE) {
  42. struct hostent* phe = gethostbyname(host);
  43. if (phe == NULL) return -10;
  44. memcpy(&addr.sin_addr, phe->h_addr, phe->h_length);
  45. }
  46. addr.sin_port = htons(port);
  47. int connfd = socket(AF_INET, SOCK_STREAM, 0);
  48. if (connfd < 0) {
  49. perror("socket");
  50. return -20;
  51. }
  52. if (nonblock) {
  53. nonblocking(connfd);
  54. }
  55. int ret = connect(connfd, (struct sockaddr*)&addr, addrlen);
  56. #ifdef OS_WIN
  57. if (ret < 0 && sockerrno != WSAEWOULDBLOCK) {
  58. #else
  59. if (ret < 0 && sockerrno != EINPROGRESS) {
  60. #endif
  61. perror("connect");
  62. closesocket(connfd);
  63. return -30;
  64. }
  65. return connfd;
  66. }