Guest User

Untitled

a guest
Jul 6th, 2018
450
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.58 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <netinet/in.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <arpa/inet.h>
  7. #include <netdb.h>
  8.  
  9. int main(int argc, char *argv[])
  10. {
  11.         struct addrinfo *tmp;
  12.         struct addrinfo hints = { 0 };
  13.  
  14.         memset(&hints, 0, sizeof hints);
  15.         hints.ai_family = AF_INET6;
  16.         hints.ai_flags = AI_NUMERICHOST;
  17.         getaddrinfo("ff01::fb", NULL, &hints, &tmp);
  18.  
  19.         int m_socket = socket(AF_INET6, SOCK_DGRAM, 0);
  20.         int off = 0;
  21.  
  22.         if (setsockopt(m_socket, IPPROTO_IPV6, IPV6_V6ONLY, &off, sizeof(off)) < 0) {
  23.                 perror("setsockopt");
  24.                 return -1;
  25.         }
  26.  
  27.         struct sockaddr_in6 *in6 = (struct sockaddr_in6*)tmp->ai_addr;
  28.         struct in6_addr* addr6 = &in6->sin6_addr;
  29.         struct ipv6_mreq mreq6 = { 0 };
  30.         memcpy(&mreq6.ipv6mr_multiaddr, addr6, sizeof *addr6);
  31.         mreq6.ipv6mr_interface = 0;
  32.  
  33.         if (setsockopt(m_socket, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mreq6, sizeof(mreq6)) < 0) {
  34.                 perror("setsockopt(IPV6_ADD_MEMBERSHIP)");
  35.                 return -1;
  36.         }
  37.  
  38.         struct sockaddr_in6 addr;
  39.         memset(&addr, 0, sizeof addr);
  40.         memcpy(&addr.sin6_addr, &in6addr_any, sizeof addr);
  41.         addr.sin6_family = AF_INET6;
  42.         addr.sin6_port = htons(5353);
  43.         if (bind(m_socket, (struct sockaddr *)&addr, sizeof addr) < 0) {
  44.                 perror("bind");
  45.                 return -1;
  46.         }
  47.  
  48.         memset(&hints, 0, sizeof hints);
  49.         hints.ai_family = AF_INET;
  50.         hints.ai_flags = AI_NUMERICHOST;
  51.         getaddrinfo("224.0.0.251", NULL, &hints, &tmp);
  52.         struct sockaddr_in *in4 = (struct sockaddr_in*)tmp->ai_addr;
  53.         struct in_addr addr4 = in4->sin_addr;
  54.         struct ip_mreqn mreq4 = { 0 };
  55.         memcpy(&mreq4.imr_multiaddr, &addr4, sizeof addr4);
  56.         mreq4.imr_ifindex = 0;
  57.  
  58.         if (setsockopt(m_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq4, sizeof(mreq4)) < 0) {
  59.                 perror("setsockopt(IP_ADD_MEMBERSHIP)");
  60.                 return -1;
  61.         }
  62.  
  63.         while (1) {
  64.                 uint8_t buf[2048];
  65.                 struct sockaddr_storage saddr;
  66.                 socklen_t len = sizeof saddr;
  67.  
  68.                 ssize_t r;
  69.                 if ((r = recvfrom(m_socket, buf, sizeof buf, 0, (struct sockaddr *)&saddr, &len)) > 0) {
  70.                         printf("received %ld %u %u\n", r, saddr.ss_family, len);
  71.                 } else {
  72.                         perror("recvfrom");
  73.                 }
  74.         }
  75.  
  76.         return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment