dgechoaddr.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include "unpifi.h"
  2. #undef MAXLINE
  3. #define MAXLINE 20 /* to see datagram truncation */
  4. void
  5. dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
  6. {
  7. int flags;
  8. const int on = 1;
  9. socklen_t len;
  10. ssize_t n;
  11. char mesg[MAXLINE], str[INET6_ADDRSTRLEN],
  12. ifname[IFNAMSIZ];
  13. struct in_addr in_zero;
  14. struct unp_in_pktinfo pktinfo;
  15. #ifdef IP_RECVDSTADDR
  16. if (setsockopt(sockfd, IPPROTO_IP, IP_RECVDSTADDR, &on, sizeof(on)) < 0)
  17. err_ret("setsockopt of IP_RECVDSTADDR");
  18. #endif
  19. #ifdef IP_RECVIF
  20. if (setsockopt(sockfd, IPPROTO_IP, IP_RECVIF, &on, sizeof(on)) < 0)
  21. err_ret("setsockopt of IP_RECVIF");
  22. #endif
  23. bzero(&in_zero, sizeof(struct in_addr)); /* all 0 IPv4 address */
  24. for ( ; ; ) {
  25. len = clilen;
  26. flags = 0;
  27. n = Recvfrom_flags(sockfd, mesg, MAXLINE, &flags,
  28. pcliaddr, &len, &pktinfo);
  29. printf("%d-byte datagram from %s", n, Sock_ntop(pcliaddr, len));
  30. if (memcmp(&pktinfo.ipi_addr, &in_zero, sizeof(in_zero)) != 0)
  31. printf(", to %s", Inet_ntop(AF_INET, &pktinfo.ipi_addr,
  32. str, sizeof(str)));
  33. if (pktinfo.ipi_ifindex > 0)
  34. printf(", recv i/f = %s",
  35. If_indextoname(pktinfo.ipi_ifindex, ifname));
  36. #ifdef MSG_TRUNC
  37. if (flags & MSG_TRUNC) printf(" (datagram truncated)");
  38. #endif
  39. #ifdef MSG_CTRUNC
  40. if (flags & MSG_CTRUNC) printf(" (control info truncated)");
  41. #endif
  42. #ifdef MSG_BCAST
  43. if (flags & MSG_BCAST) printf(" (broadcast)");
  44. #endif
  45. #ifdef MSG_MCAST
  46. if (flags & MSG_MCAST) printf(" (multicast)");
  47. #endif
  48. printf("\n");
  49. Sendto(sockfd, mesg, n, 0, pcliaddr, len);
  50. }
  51. }