tcp.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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", io->fd, io->error);
  7. }
  8. void on_recv(hio_t* io, void* buf, int readbytes) {
  9. printf("on_recv fd=%d readbytes=%d\n", io->fd, readbytes);
  10. char localaddrstr[INET6_ADDRSTRLEN+16] = {0};
  11. char peeraddrstr[INET6_ADDRSTRLEN+16] = {0};
  12. printf("[%s] <=> [%s]\n",
  13. sockaddr_snprintf(io->localaddr, localaddrstr, sizeof(localaddrstr)),
  14. sockaddr_snprintf(io->peeraddr, peeraddrstr, sizeof(peeraddrstr)));
  15. printf("< %s\n", buf);
  16. // echo
  17. printf("> %s\n", buf);
  18. hsend(io->loop, io->fd, buf, readbytes, NULL);
  19. }
  20. void on_accept(hio_t* io) {
  21. printf("on_accept connfd=%d\n", io->fd);
  22. char localaddrstr[INET6_ADDRSTRLEN+16] = {0};
  23. char peeraddrstr[INET6_ADDRSTRLEN+16] = {0};
  24. printf("accept connfd=%d [%s] <= [%s]\n", io->fd,
  25. sockaddr_snprintf(io->localaddr, localaddrstr, sizeof(localaddrstr)),
  26. sockaddr_snprintf(io->peeraddr, peeraddrstr, sizeof(peeraddrstr)));
  27. hrecv(io->loop, io->fd, recvbuf, RECV_BUFSIZE, on_recv);
  28. io->close_cb = on_close;
  29. }
  30. int main(int argc, char** argv) {
  31. if (argc < 2) {
  32. printf("Usage: cmd port\n");
  33. return -10;
  34. }
  35. int port = atoi(argv[1]);
  36. hloop_t loop;
  37. hloop_init(&loop);
  38. hio_t* listenio = create_tcp_server(&loop, port, on_accept);
  39. if (listenio == NULL) {
  40. return -20;
  41. }
  42. printf("listenfd=%d\n", listenio->fd);
  43. hloop_run(&loop);
  44. return 0;
  45. }