Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <netinet/in.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <netdb.h>
- int main(int argc, char *argv[])
- {
- struct addrinfo *tmp;
- struct addrinfo hints = { 0 };
- memset(&hints, 0, sizeof hints);
- hints.ai_family = AF_INET6;
- hints.ai_flags = AI_NUMERICHOST;
- getaddrinfo("ff01::fb", NULL, &hints, &tmp);
- int m_socket = socket(AF_INET6, SOCK_DGRAM, 0);
- int off = 0;
- if (setsockopt(m_socket, IPPROTO_IPV6, IPV6_V6ONLY, &off, sizeof(off)) < 0) {
- perror("setsockopt");
- return -1;
- }
- struct sockaddr_in6 *in6 = (struct sockaddr_in6*)tmp->ai_addr;
- struct in6_addr* addr6 = &in6->sin6_addr;
- struct ipv6_mreq mreq6 = { 0 };
- memcpy(&mreq6.ipv6mr_multiaddr, addr6, sizeof *addr6);
- mreq6.ipv6mr_interface = 0;
- if (setsockopt(m_socket, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mreq6, sizeof(mreq6)) < 0) {
- perror("setsockopt(IPV6_ADD_MEMBERSHIP)");
- return -1;
- }
- struct sockaddr_in6 addr;
- memset(&addr, 0, sizeof addr);
- memcpy(&addr.sin6_addr, &in6addr_any, sizeof addr);
- addr.sin6_family = AF_INET6;
- addr.sin6_port = htons(5353);
- if (bind(m_socket, (struct sockaddr *)&addr, sizeof addr) < 0) {
- perror("bind");
- return -1;
- }
- memset(&hints, 0, sizeof hints);
- hints.ai_family = AF_INET;
- hints.ai_flags = AI_NUMERICHOST;
- getaddrinfo("224.0.0.251", NULL, &hints, &tmp);
- struct sockaddr_in *in4 = (struct sockaddr_in*)tmp->ai_addr;
- struct in_addr addr4 = in4->sin_addr;
- struct ip_mreqn mreq4 = { 0 };
- memcpy(&mreq4.imr_multiaddr, &addr4, sizeof addr4);
- mreq4.imr_ifindex = 0;
- if (setsockopt(m_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq4, sizeof(mreq4)) < 0) {
- perror("setsockopt(IP_ADD_MEMBERSHIP)");
- return -1;
- }
- while (1) {
- uint8_t buf[2048];
- struct sockaddr_storage saddr;
- socklen_t len = sizeof saddr;
- ssize_t r;
- if ((r = recvfrom(m_socket, buf, sizeof buf, 0, (struct sockaddr *)&saddr, &len)) > 0) {
- printf("received %ld %u %u\n", r, saddr.ss_family, len);
- } else {
- perror("recvfrom");
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment