1
0

udp_echo_server.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. /*
  2. * udp echo server
  3. *
  4. * @build make examples
  5. * @server bin/udp_echo_server 1234
  6. * @client bin/nc -u 127.0.0.1 1234
  7. * nc -u 127.0.0.1 1234
  8. *
  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_recvfrom(hio_t* io, void* buf, int readbytes) {
  16. printf("on_recvfrom 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. int main(int argc, char** argv) {
  28. if (argc < 2) {
  29. printf("Usage: %s port\n", argv[0]);
  30. return -10;
  31. }
  32. int port = atoi(argv[1]);
  33. hloop_t* loop = hloop_new(0);
  34. hio_t* io = hloop_create_udp_server(loop, "0.0.0.0", port);
  35. if (io == NULL) {
  36. return -20;
  37. }
  38. hio_setcb_close(io, on_close);
  39. hio_setcb_read(io, on_recvfrom);
  40. hio_read(io);
  41. hloop_run(loop);
  42. hloop_free(&loop);
  43. return 0;
  44. }