参考《TCP/IP网络编程第14章》
多播发送端代码:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <sys/socket.h>
#include <sys/unistd.h>
#include <sys/types.h>
#include <sys/errno.h>
#include <netinet/in.h>
#include <signal.h>
#include <arpa/inet.h>
#include <iostream>
#include <string>
using std::cout;
using std::cin;
using std::string;
using std::endl;
#define BUF_SIZE 30
#define TTL 64
#define MULTI_GROUP_IP "224.1.1.2"
#define DEFAULT_PORT 9190
int main()
{
int send_sock;
struct sockaddr_in mul_adr;
int time_live = TTL;
FILE *fp;
char buf[BUF_SIZE];
send_sock = socket(PF_INET, SOCK_DGRAM,0);
bzero(&mul_adr, sizeof(mul_adr));
mul_adr.sin_family = AF_INET;
mul_adr.sin_addr.s_addr = inet_addr(MULTI_GROUP_IP);
mul_adr.sin_port = htons(DEFAULT_PORT);
//指定套接字中 TTL 的信息
setsockopt(send_sock, IPPROTO_IP, IP_MULTICAST_TTL, (void*) &time_live, sizeof(time_live));
if((fp = fopen("news.txt", "r")) == NULL)
cout << "fopen() error" << endl;
while(!feof(fp))//如果文件没结束就返回0
{
fgets(buf, BUF_SIZE, fp);
sendto(send_sock, buf, strlen(buf), 0, (struct sockaddr*) &mul_adr, sizeof(mul_adr));
sleep(2);
}
fclose(fp);
close(send_sock);
return 0;
}
多播接收端代码:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <sys/socket.h>
#include <sys/unistd.h>
#include <sys/types.h>
#include <sys/errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream>
#include <string>
using std::cout;
using std::cin;
using std::string;
using std::endl;
#define BUF_SIZE 30
#define GROUP_IP "224.1.1.2"
#define DEFAULT_PORT 9190
int main()
{
int recv_sock;
int str_len;
char buf[BUF_SIZE];
struct sockaddr_in adr;
struct ip_mreq join_adr;
recv_sock = socket(PF_INET, SOCK_DGRAM, 0);
bzero(&adr, sizeof(adr));
adr.sin_family = AF_INET;
adr.sin_addr.s_addr = htonl(INADDR_ANY);
adr.sin_port = htons(9190);
if(bind(recv_sock, (struct sockaddr*) &adr, sizeof(adr)) == -1)
cout << "bind() error" << endl;
//初始化结构体
join_adr.imr_multiaddr.s_addr = inet_addr(GROUP_IP); //多播组地址
join_adr.imr_interface.s_addr = htonl(INADDR_ANY);//待加入的IP地址
//利用套接字选项 IP_ADD_MEMBERSHIP 加入多播组,完成了接受指定的多播组数据的所有准备
setsockopt(recv_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*)&join_adr, sizeof(join_adr));
while(1)
{
//通过 recvfrom 函数接受多播数据。如果不需要知道传输数据的主机地址信息
str_len = recvfrom(recv_sock, buf, BUF_SIZE - 1, 0, NULL, 0);
if(str_len < 0) break;
cout << buf << endl;
}
close(recv_sock);
return 0;
}