#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <net/if.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
- int sock6;
+ int err;
+ int sock6 = -1;
struct sockaddr_in6 name6;
ssize_t len6 = sizeof(name6);
+ struct ipv6_mreq mreq;
char buf[1024];
ssize_t msg_len;
sock6 = socket(AF_INET6, SOCK_DGRAM, 0);
if (sock6 == -1) {
perror("opening v6 listening socket");
- exit(1);
+ goto die;
+ }
+
+ memset(&mreq, 0, sizeof(struct ipv6_mreq));
+ err = inet_pton(AF_INET6, "ff02::1:3", &mreq.ipv6mr_multiaddr);
+ if (err < 1) {
+ fprintf(stderr, "failed to convert ff02::1:3 to an address\n");
+ goto die;
+ }
+ mreq.ipv6mr_interface = if_nametoindex("br0");
+
+ err = setsockopt(sock6, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq,
+ sizeof(struct ipv6_mreq));
+ if (err != 0) {
+ perror("joining multicast group");
+ goto die;
}
memset(&name6, 0, len6);
if (bind(sock6, (struct sockaddr *) &name6, len6) == -1) {
perror("binding to v6 socket");
- exit(1);
+ goto die;
}
while(true) {
if (msg_len == -1) {
perror("receiving data");
- exit(1);
+ goto die;
}
buf[msg_len] = '\0';
close(sock6);
return 0;
+
+die:
+
+ if (sock6 != -1) {
+ close(sock6);
+ }
+ exit(1);
}
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
+#include <net/if.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
{
int err;
int sock6;
+ int idx = if_nametoindex("br0");
struct addrinfo hints, *ai, *pai;
- if (argc < 2) {
- fprintf(stderr, "Usage: %s <host>\n", argv[0]);
- exit(2);
- }
-
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET6;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = 0;
hints.ai_protocol = 0;
- err = getaddrinfo(argv[1], "5355", &hints, &ai);
+ err = getaddrinfo("ff02::1:3", "5355", &hints, &ai);
if (err != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(err));
exit(1);
continue;
}
+ err = setsockopt(sock6, IPPROTO_IPV6, IPV6_MULTICAST_IF, &idx, sizeof(idx));
+ if (err != 0) {
+ perror("setting default multicast interface");
+ }
+
if (connect(sock6, pai->ai_addr, pai->ai_addrlen) != -1) {
/* success, end loop */
break;
}
if (pai == NULL) {
- fprintf(stderr, "Could not connect to %s\n", argv[1]);
+ fprintf(stderr, "Could not connect to %s\n", "ff02::1:3");
exit(1);
}