lv8 Embedded Development-Network Programming Development 18 Implementation of Broadcast and Multicast

Table of Contents

1 broadcast

1.1 What is broadcasting?

1.2 Broadcast address

1.3 Implementation of broadcast

2 multicast

2.1 Classified IP addresses

2.2 Multicast IP Address

2.3 Implementation of multicast


1 broadcast

1.1 What is broadcasting?

The method of sending data packets has only one receiver, which is called unicast

If it is sent to all hosts in the LAN at the same time, it is called broadcast

Only user datagrams (using UDP protocol) sockets can broadcast

1.2 broadcast address

  • An IP address with all host numbers in a network being 1 is a broadcast address.
  • Data packets sent to this address are received by all hosts
  • 255.255.255.255 represents the broadcast address in all network segments

1.3 Broadcasting Implementation

Broadcasting implementation

sender.c

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <strings.h>
#include <string.h>

#define ErrExit(msg) do {perror(msg); exit(EXIT_FAILURE);} while(0)
typedef struct sockaddr Addr;
typedef struct sockaddr_in Addr_in;

int main(int argc, char *argv[])
{
int fd = -1;
Addr_in peeraddr;
socklen_t peerlen = sizeof(peeraddr);
char buf[BUFSIZ] = {};
/*Parameter check*/
if(argc < 3){
fprintf(stderr, "%s<multiaddr><port>", argv[0]);
exit(EXIT_FAILURE);
}
/*Create socket*/
if( (fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0)
ErrExit("socket");

/*Allow broadcast*/
int on = 1;
setsockopt(fd, SOL_SOCKET, SO_BROADCAST, & amp;on, sizeof(on));

/*Set communication structure*/
peeraddr.sin_family = AF_INET;
peeraddr.sin_port = htons(atoi(argv[2]));
if(!inet_aton(argv[1], & amp;peeraddr.sin_addr) ){
fprintf(stderr, "Invalid address\
");
exit(EXIT_FAILURE);
}
while(1){
fgets(buf, BUFSIZ, stdin);
sendto(fd, buf, strlen(buf) + 1, 0, (Addr *) & amp;peeraddr, peerlen);
}
return 0;
}

receiver.c

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <strings.h>

#define ErrExit(msg) do {perror(msg); exit(EXIT_FAILURE);} while(0)
typedef struct sockaddr Addr;
typedef struct sockaddr_in Addr_in;

int main(int argc, char *argv[])
{
int fd = -1;
Addr_in myaddr, peeraddr;
socklen_t peerlen = sizeof(peeraddr);
char buf[BUFSIZ] = {};
/*Parameter check*/
if(argc < 3){
fprintf(stderr, "%s<addr><port>", argv[0]);
exit(EXIT_FAILURE);
}
/*Create socket*/
if( (fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0)
ErrExit("socket");
/*Set communication structure*/
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(atoi(argv[2]));
if(!inet_aton(argv[1], & amp;myaddr.sin_addr) ){
fprintf(stderr, "Invalid address\
");
exit(EXIT_FAILURE);
}
/*Bind communication structure*/
if( bind(fd, (Addr *) & amp;myaddr, sizeof(Addr_in)) )
ErrExit("bind");
while(1){
recvfrom(fd, buf, BUFSIZ, 0, (Addr *) & amp;peeraddr, & amp;peerlen);
printf("[%s:%d]%s\
", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port), buf);
}
return 0;
}

2 multicast

2.1 Classified IP Address

2.2 Multicast IP Address

  • The multicast group identifier needs to be written into the destination address of the IP multicast datagram.
  • The identifier of the multicast group is the Class D address (multicast address) in the IP address. Address range: 224.0.0.0 ~ 239.255.255.255
  • Each Class D address identifies a multicast group.
  • Multicast addresses can only be used for destination addresses, not source addresses.

2.3 Multicast Implementation

  • Create user datagram socket
  • Join multicast group
  • Bind multicast IP address and port
  • Waiting to receive data
struct ip_mreqn {
    struct in_addr imr_multiaddr; /*IP multicast group address*/
    struct in_addr imr_address; /*IP address of local interface*/
    int imr_ifindex; /*Local network card number*/
}
if(setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, & amp;mreq, sizeof(mreq)) < 0){
perror("setsockopt");
exit(0);
}

sender.c

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <strings.h>
#include <string.h>

#define ErrExit(msg) do {perror(msg); exit(EXIT_FAILURE);} while(0)
typedef struct sockaddr Addr;
typedef struct sockaddr_in Addr_in;

int main(int argc, char *argv[])
{
int fd = -1;
Addr_in peeraddr;
socklen_t peerlen = sizeof(peeraddr);
char buf[BUFSIZ] = {};
/*Parameter check*/
if(argc < 3){
fprintf(stderr, "%s<multiaddr><port>", argv[0]);
exit(EXIT_FAILURE);
}
/*Create socket*/
if( (fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0)
ErrExit("socket");

/*Set communication structure*/
peeraddr.sin_family = AF_INET;
peeraddr.sin_port = htons(atoi(argv[2]));
if(!inet_aton(argv[1], & amp;peeraddr.sin_addr) ){
fprintf(stderr, "Invalid address\
");
exit(EXIT_FAILURE);
}
while(1){
fgets(buf, BUFSIZ, stdin);
sendto(fd, buf, strlen(buf) + 1, 0, (Addr *) & amp;peeraddr, peerlen);
}
return 0;
}

receiver.c

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <strings.h>

#define ErrExit(msg) do {perror(msg); exit(EXIT_FAILURE);} while(0)
typedef struct sockaddr Addr;
typedef struct sockaddr_in Addr_in;

int main(int argc, char *argv[])
{
int fd = -1;
Addr_in myaddr, peeraddr;
socklen_t peerlen = sizeof(peeraddr);
struct ip_mreqn mreq;
char buf[BUFSIZ] = {};
/*Parameter check*/
if(argc < 3){
fprintf(stderr, "%s<addr><port>", argv[0]);
exit(EXIT_FAILURE);
}
/*Create socket*/
if( (fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0)
ErrExit("socket");
/*Join multicast group*/
bzero( & amp;mreq, sizeof(mreq) );
if(!inet_aton(argv[1], & amp;mreq.imr_multiaddr) ){
fprintf(stderr, "Invalid address\
");
exit(EXIT_FAILURE);
}
if(setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, & amp;mreq, sizeof(mreq)) < 0){
perror("setsockopt");
exit(0);
}

/*Set communication structure*/
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(atoi(argv[2]));
if(!inet_aton(argv[1], & amp;myaddr.sin_addr) ){
fprintf(stderr, "Invalid address\
");
exit(EXIT_FAILURE);
}
/*Bind communication structure*/
if( bind(fd, (Addr *) & amp;myaddr, sizeof(Addr_in)) )
ErrExit("bind");
while(1){
recvfrom(fd, buf, BUFSIZ, 0, (Addr *) & amp;peeraddr, & amp;peerlen);
printf("[%s:%d]%s\
", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port), buf);
}
return 0;
}