dgechoaddr.lc 3.4 KB

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