1
0

tcp.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include "hloop.h"
  2. #include "hsocket.h"
  3. #define RECV_BUFSIZE 8192
  4. static char recvbuf[RECV_BUFSIZE];
  5. void on_close(hio_t* io) {
  6. printf("on_close fd=%d error=%d\n", hio_fd(io), hio_error(io));
  7. }
  8. void on_recv(hio_t* io, void* buf, int readbytes) {
  9. printf("on_recv fd=%d readbytes=%d\n", hio_fd(io), readbytes);
  10. char localaddrstr[INET6_ADDRSTRLEN+16] = {0};
  11. char peeraddrstr[INET6_ADDRSTRLEN+16] = {0};
  12. printf("[%s] <=> [%s]\n",
  13. sockaddr_snprintf(hio_localaddr(io), localaddrstr, sizeof(localaddrstr)),
  14. sockaddr_snprintf(hio_peeraddr(io), peeraddrstr, sizeof(peeraddrstr)));
  15. printf("< %s\n", buf);
  16. // echo
  17. printf("> %s\n", buf);
  18. hio_write(io, buf, readbytes);
  19. }
  20. void on_accept(hio_t* io) {
  21. printf("on_accept connfd=%d\n", hio_fd(io));
  22. char localaddrstr[INET6_ADDRSTRLEN+16] = {0};
  23. char peeraddrstr[INET6_ADDRSTRLEN+16] = {0};
  24. printf("accept connfd=%d [%s] <= [%s]\n", hio_fd(io),
  25. sockaddr_snprintf(hio_localaddr(io), localaddrstr, sizeof(localaddrstr)),
  26. sockaddr_snprintf(hio_peeraddr(io), peeraddrstr, sizeof(peeraddrstr)));
  27. hio_setcb_close(io, on_close);
  28. hio_setcb_read(io, on_recv);
  29. hio_set_readbuf(io, recvbuf, RECV_BUFSIZE);
  30. hio_read(io);
  31. }
  32. int main(int argc, char** argv) {
  33. if (argc < 2) {
  34. printf("Usage: cmd port\n");
  35. return -10;
  36. }
  37. int port = atoi(argv[1]);
  38. hloop_t* loop = hloop_new(0);
  39. hio_t* listenio = create_tcp_server(loop, "0.0.0.0", port, on_accept);
  40. if (listenio == NULL) {
  41. return -20;
  42. }
  43. printf("listenfd=%d\n", hio_fd(listenio));
  44. hloop_run(loop);
  45. hloop_free(&loop);
  46. return 0;
  47. }