| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- #include "unpifi.h"
- #undef MAXLINE
- #define MAXLINE 20 /* to see datagram truncation */
- void
- dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
- {
- int flags;
- const int on = 1;
- socklen_t len;
- ssize_t n;
- char mesg[MAXLINE], str[INET6_ADDRSTRLEN],
- ifname[IFNAMSIZ];
- struct in_addr in_zero;
- struct unp_in_pktinfo pktinfo;
- #ifdef IP_RECVDSTADDR
- if (setsockopt(sockfd, IPPROTO_IP, IP_RECVDSTADDR, &on, sizeof(on)) < 0)
- err_ret("setsockopt of IP_RECVDSTADDR");
- #endif
- #ifdef IP_RECVIF
- if (setsockopt(sockfd, IPPROTO_IP, IP_RECVIF, &on, sizeof(on)) < 0)
- err_ret("setsockopt of IP_RECVIF");
- #endif
- bzero(&in_zero, sizeof(struct in_addr)); /* all 0 IPv4 address */
- for ( ; ; ) {
- len = clilen;
- flags = 0;
- n = Recvfrom_flags(sockfd, mesg, MAXLINE, &flags,
- pcliaddr, &len, &pktinfo);
- printf("%d-byte datagram from %s", n, Sock_ntop(pcliaddr, len));
- if (memcmp(&pktinfo.ipi_addr, &in_zero, sizeof(in_zero)) != 0)
- printf(", to %s", Inet_ntop(AF_INET, &pktinfo.ipi_addr,
- str, sizeof(str)));
- if (pktinfo.ipi_ifindex > 0)
- printf(", recv i/f = %s",
- If_indextoname(pktinfo.ipi_ifindex, ifname));
- #ifdef MSG_TRUNC
- if (flags & MSG_TRUNC) printf(" (datagram truncated)");
- #endif
- #ifdef MSG_CTRUNC
- if (flags & MSG_CTRUNC) printf(" (control info truncated)");
- #endif
- #ifdef MSG_BCAST
- if (flags & MSG_BCAST) printf(" (broadcast)");
- #endif
- #ifdef MSG_MCAST
- if (flags & MSG_MCAST) printf(" (multicast)");
- #endif
- printf("\n");
- Sendto(sockfd, mesg, n, 0, pcliaddr, len);
- }
- }
|