1
0

tcp_echo_server.c 1.7 KB

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