tcp.c 1.5 KB

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