udp.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  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_recvfrom(hio_t* io, void* buf, int readbytes) {
  9. printf("on_recvfrom 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. hsendto(io->loop, io->fd, buf, readbytes, NULL);
  19. }
  20. int main(int argc, char** argv) {
  21. if (argc < 2) {
  22. printf("Usage: cmd port\n");
  23. return -10;
  24. }
  25. int port = atoi(argv[1]);
  26. hloop_t loop;
  27. hloop_init(&loop);
  28. hio_t* io = create_udp_server(&loop, port);
  29. if (io == NULL) {
  30. return -20;
  31. }
  32. io->close_cb = on_close;
  33. hrecvfrom(&loop, io->fd, recvbuf, RECV_BUFSIZE, on_recvfrom);
  34. hloop_run(&loop);
  35. return 0;
  36. }