]> git.sesse.net Git - multicastwardrive/blob - multicastwardrive.c
Initial checkin.
[multicastwardrive] / multicastwardrive.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/socket.h>
5 #include <netinet/in.h>
6 #include <netinet/ip.h>
7 #include <arpa/inet.h>
8
9 // #define NETWORK "233.121.29.%d"  // workzone
10 // #define NETWORK "233.83.45.%d"   // nrk [tomt]
11 // #define NETWORK "233.60.200.%d"   // comvie [tomt]
12 // #define NETWORK "239.193.0.%d"   // uninett??
13 // #define NETWORK "233.155.107.%d"   // tv2
14 #define NETWORK "224.67.163.%d"     // blokk med stortinget i
15
16 void join_group(int sock, int i)
17 {
18         struct ip_mreqn mreq;
19         // char buf[256];
20         // snprintf(buf, 256, NETWORK, i);
21         // printf("%s\n", buf);
22         //mreq.imr_multiaddr.s_addr = inet_addr(buf);
23
24         mreq.imr_multiaddr.s_addr = i;
25         printf("%s\n", inet_ntoa(mreq.imr_multiaddr));
26         mreq.imr_address.s_addr = INADDR_ANY;
27         mreq.imr_ifindex = 0;
28         setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
29 }
30
31 void leave_group(int sock, int i)
32 {
33         struct ip_mreqn mreq;
34         // char buf[256];
35         // snprintf(buf, 256, NETWORK, i);
36         // mreq.imr_multiaddr.s_addr = inet_addr(buf);
37         mreq.imr_multiaddr.s_addr = i;
38         mreq.imr_address.s_addr = INADDR_ANY;
39         mreq.imr_ifindex = 0;
40         setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq));
41 }
42
43 int main(int argc, char **argv)
44 {
45         int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
46         in_addr_t from = inet_addr(argv[1]);
47         in_addr_t to = inet_addr(argv[2]);
48         uint32_t skip = atoi(argv[3]);
49
50         for (in_addr_t i = ntohl(from); i <= ntohl(to); i += skip) {
51                 join_group(sock, htonl(i));
52                 if (i - ntohl(from) >= 10 * skip) {
53                         leave_group(sock, htonl(i - 10 * skip));
54                 }
55                 usleep(200000);
56         }
57
58         sleep(2);
59 }