2 receive multicast socket test
3 by inkling@nop.org 2-dec-2005
4 released to public domain
10 #include <sys/socket.h>
11 #include <netinet/in.h>
12 #include <arpa/inet.h>
15 #define MULTICAST_ADDRESS "224.1.2.3"
16 #define MULTICAST_PORT 1234
19 main( int argc
, char ** argv
)
21 struct sockaddr_in sockin
;
23 unsigned char tsbuf
[188];
24 int sockfd
, bindok
, ruok
, imok
, bc
, rx
;
29 sockin_len
= sizeof(sockin
);
33 sockfd
= socket( AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
35 perror( "socket open ");
39 /* set socket as re-usable */
40 ruok
= setsockopt( sockfd
, SOL_SOCKET
, SO_REUSEADDR
, &yes
, sizeof(yes
));
42 perror( "socket reuse ");
46 /* set socket as multicast group */
47 im
.imr_multiaddr
.s_addr
= inet_addr( MULTICAST_ADDRESS
);
48 im
.imr_interface
.s_addr
= htonl( INADDR_ANY
);
49 imok
= setsockopt( sockfd
, IPPROTO_IP
, IP_ADD_MEMBERSHIP
, &im
, sizeof(im
));
51 perror( "socket multicast ");
55 /* bind socket AFTER setting socket options */
56 /* gives re-use error if you try bind first */
57 memset( &sockin
, 0, sockin_len
);
58 sockin
.sin_family
= AF_INET
;
59 sockin
.sin_addr
.s_addr
= htonl( INADDR_ANY
);
60 sockin
.sin_port
= htons( MULTICAST_PORT
);
61 bindok
= bind( sockfd
, (struct sockaddr
*)&sockin
, sockin_len
);
63 perror( "socket bind ");
67 /* memset( &sockin, 0, sizeof(sockin) ); */
68 rx
= recvfrom( sockfd
,
71 (struct sockaddr
*)&sockin
,
81 fprintf( stdout
, "received %d bytes %d total\n", rx
, bc
);