Set the cut path properly when a non-default output path is specified
[atscap.git] / rxsock.c
blob09dcc8e20f3270a5056dfa146e4ea4d501b7976f
1 /*
2 receive multicast socket test
3 by inkling@nop.org 2-dec-2005
4 released to public domain
5 */
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <unistd.h>
10 #include <sys/socket.h>
11 #include <netinet/in.h>
12 #include <arpa/inet.h>
13 #include <string.h>
15 #define MULTICAST_ADDRESS "224.1.2.3"
16 #define MULTICAST_PORT 1234
18 int
19 main( int argc, char ** argv)
21 struct sockaddr_in sockin;
22 struct ip_mreq im;
23 unsigned char tsbuf[188];
24 int sockfd, bindok, ruok, imok, bc, rx;
25 unsigned int yes = 1;
26 int sockin_len;
28 bc = 0;
29 sockin_len = sizeof(sockin);
32 /* open socket */
33 sockfd = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
34 if (-1 == sockfd) {
35 perror( "socket open ");
36 exit(1);
39 /* set socket as re-usable */
40 ruok = setsockopt( sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
41 if (-1 == ruok) {
42 perror( "socket reuse ");
43 exit(1);
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));
50 if (-1 == imok) {
51 perror( "socket multicast ");
52 exit(1);
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 );
62 if (-1 == bindok) {
63 perror( "socket bind ");
64 exit(1);
66 while(1) {
67 /* memset( &sockin, 0, sizeof(sockin) ); */
68 rx = recvfrom( sockfd,
69 tsbuf, sizeof(tsbuf),
71 (struct sockaddr *)&sockin,
72 &sockin_len
75 if( -1 == rx) {
76 perror( "recvfrom ");
77 exit(1);
80 bc += rx;
81 fprintf( stdout, "received %d bytes %d total\n", rx, bc);
84 return 0;