//server.c#include<stdio.h>#include<unistd.h>#include<string.h>#include<arpa/inet.h>#include<net/if.h>#define SERV_PORT 8000#define MAXLINE 1500#define CLIE_PORT 9000#define GROUP "239.0.0.2"/* system-defined struct about multicast information in /usr/include
struct ip_mreqn {
struct in_addr imr_multiaddr; // IP multicast address of group
struct in_addr imr_address; // local IP address of interface
int imr_ifindex; // Interface index
};
*/intmain(){int sockfd;struct sockaddr_in serv_addr, clie_addr;char buf[MAXLINE]="hey you!\n";struct ip_mreqn group;
sockfd =socket(AF_INET, SOCK_DGRAM,0);bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr =htonl(INADDR_ANY);
serv_addr.sin_port =htons(SERV_PORT);bind(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));//specify the info of group receiving broadcastinet_pton(AF_INET, GROUP,&group.imr_multiaddr);//group IPinet_pton(AF_INET,"0.0.0.0",&group.imr_address);//group.imr_address = htonl(INADDR_ANY);
group.imr_ifindex =if_nametoindex("eth0");//eth0 -> index cmd: ip ad setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_IF,&group,sizeof(group));//get multicast permission//specify the info of clients to receive multicast messagebzero(&clie_addr,sizeof(clie_addr));
clie_addr.sin_family = AF_INET;inet_pton(AF_INET, GROUP,&clie_addr.sin_addr.s_addr);
clie_addr.sin_port =htons(CLIE_PORT);int i =0;while(1){sprintf(buf,"hey you! %d\n", i++);//fgets(buf, sizeof(buf), stdin);sendto(sockfd, buf,strlen(buf),0,(struct sockaddr *)&clie_addr,sizeof(clie_addr));sleep(1);}close(sockfd);return0;}//client.c#include<stdio.h>#include<unistd.h>#include<string.h>#include<arpa/inet.h>#include<net/if.h>#define SERV_PORT 8000#define CLIE_PORT 9000#define GROUP "239.0.0.2"intmain(){struct sockaddr_in local_addr;int cfd;
ssize_t len;char buf[BUFSIZ];struct ip_mreqn group;//multicast group
cfd =socket(AF_INET, SOCK_DGRAM,0);bzero(&local_addr,sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr =htonl(INADDR_ANY);
local_addr.sin_port =htons(CLIE_PORT);bind(cfd,(struct sockaddr *)&local_addr,sizeof(local_addr));//specify the multicast group this client is to join (same as in server.c)inet_pton(AF_INET, GROUP,&group.imr_multiaddr);inet_pton(AF_INET,"0.0.0.0",&group.imr_address);
group.imr_ifindex =if_nametoindex("eth0");setsockopt(cfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,&group,sizeof(group));while(1){
len =recvfrom(cfd, buf,sizeof(buf),0,NULL,0);write(STDOUT_FILENO, buf, len);}return0;}