1 /* Multicast test, listener */
4 #include <sys/socket.h>
5 #include <netinet/in.h>
15 int main(int argc, char **argv)
19 struct sockaddr_in6 name6;
20 ssize_t len6 = sizeof(name6);
21 struct sockaddr_storage peer_addr;
22 struct ipv6_mreq mreq;
25 socklen_t peer_addr_len;
26 char host[NI_MAXHOST], service[NI_MAXSERV];
28 sock6 = socket(AF_INET6, SOCK_DGRAM, 0);
30 perror("opening v6 listening socket");
34 memset(&mreq, 0, sizeof(struct ipv6_mreq));
35 err = inet_pton(AF_INET6, "ff02::1:3", &mreq.ipv6mr_multiaddr);
37 fprintf(stderr, "failed to convert ff02::1:3 to an address\n");
40 mreq.ipv6mr_interface = if_nametoindex("wlan0");
42 err = setsockopt(sock6, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq,
43 sizeof(struct ipv6_mreq));
45 perror("joining multicast group");
49 memset(&name6, 0, len6);
51 name6.sin6_family = PF_INET6;
52 name6.sin6_addr = in6addr_any;
53 name6.sin6_port = htons(5355);
55 if (bind(sock6, (struct sockaddr *) &name6, len6) == -1) {
56 perror("binding to v6 socket");
61 peer_addr_len = sizeof(struct sockaddr_storage);
62 msg_len = recvfrom(sock6, buf, 1024, 0,
63 (struct sockaddr *)&peer_addr, &peer_addr_len);
65 perror("receiving data");
69 buf[2] |= 0x10; /* We're a reply, honest! */
71 err = getnameinfo((struct sockaddr *)&peer_addr, peer_addr_len,
72 host, NI_MAXHOST, service, NI_MAXSERV, NI_NUMERICSERV);
75 printf("Got %ld bytes from %s:%s\n", (long) msg_len,
78 fprintf(stderr, "getnameinfo: %s\n", gai_strerror(err));
82 if(sendto(sock6, buf, msg_len, 0,
83 (struct sockaddr *)&peer_addr, peer_addr_len) != msg_len) {
84 perror("sending reply");
87 printf("Sent %ld bytes back\n", (long) msg_len);