【网络编程实例】C++实现多播

参考《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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值