Created
June 1, 2021 11:30
-
-
Save Tibalt/7d3846a724894ecf41e749353a096ff4 to your computer and use it in GitHub Desktop.
udp multicast example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* | |
* multicast.c | |
* | |
* The following program sends or receives multicast packets. If invoked | |
* with one argument, it sends a packet containing the current time to an | |
* arbitrarily chosen multicast group and UDP port. If invoked with no | |
* arguments, it receives and prints these packets. Start it as a sender on | |
* just one host and as a receiver on all the other hosts | |
* | |
* */ | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <netinet/in.h> | |
#include <arpa/inet.h> | |
#include <time.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#define EXAMPLE_PORT 61499 | |
#define EXAMPLE_GROUP "226.0.0.1" | |
main(int argc) | |
{ | |
struct sockaddr_in addr; | |
int addrlen, sock, cnt; | |
struct ip_mreq mreq; | |
char message[50]; | |
/* set up socket */ | |
sock = socket(AF_INET, SOCK_DGRAM, 0); | |
if (sock < 0) { | |
perror("socket"); | |
exit(1); | |
} | |
bzero((char *)&addr, sizeof(addr)); | |
addr.sin_family = AF_INET; | |
addr.sin_addr.s_addr = htonl(INADDR_ANY); | |
addr.sin_port = htons(EXAMPLE_PORT); | |
addrlen = sizeof(addr); | |
if (argc > 1) { | |
/* send */ | |
addr.sin_addr.s_addr = inet_addr(EXAMPLE_GROUP); | |
while (1) { | |
time_t t = time(0); | |
sprintf(message, "time is %-24.24s", ctime(&t)); | |
printf("sending: %s\n", message); | |
cnt = sendto(sock, message, sizeof(message), 0, | |
(struct sockaddr *) &addr, addrlen); | |
if (cnt < 0) { | |
perror("sendto"); | |
exit(1); | |
} | |
sleep(5); | |
} | |
} else { | |
int optval = 1; | |
if(setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)) < 0){ | |
perror("set socket reuse error:"); | |
} | |
/* receive */ | |
if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) | |
{ | |
perror("bind"); | |
exit(1); | |
} | |
mreq.imr_multiaddr.s_addr = inet_addr(EXAMPLE_GROUP); | |
mreq.imr_interface.s_addr = htonl(INADDR_ANY); | |
if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, | |
&mreq, sizeof(mreq)) < 0) { | |
perror("setsockopt mreq"); | |
exit(1); | |
} | |
while (1) { | |
cnt = recvfrom(sock, message, sizeof(message), 0, | |
(struct sockaddr *) &addr, &addrlen); | |
if (cnt < 0) { | |
perror("recvfrom"); | |
exit(1); | |
} else if (cnt == 0) { | |
break; | |
} | |
printf("%s: message = \"%s\"\n", inet_ntoa(addr.sin_addr), message); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment