基于UDP的C/S多播回射服务器

本文介绍了一个基于UDP的C/S多播服务器实验,详细解析了试验模型、运行结果以及源代码,涉及IPv4多播组的加入与离开操作。通过对源代码的分析,深入理解多播组选项及其在实际应用中的作用。
摘要由CSDN通过智能技术生成

一、多播服务器

试验模型图:


试验内容:

本次试验是在两台在同一个子网的linux主机下运行的服务器程序, 然后选择其中任意一台主机运行客服端程序。

1)、首先运行服务器程序,将PC1和PC2加入224.0.0.1多播组当中
2)、然后客户端程序, 向该多播组发送发生一串回文。
3)、客户端程序将会接收到2个PC1 和PC 2的回文串


运行结果如下:


二、针对上述实验的知识点分析

源代码1如下:

udpmcastserver01.c

#include "unp.h"
#include "mcast.h"

int main(int argc, char **argv)
{
    int sockfd;
    struct sockaddr_in cliaddr;
    struct ip_mreq mreq;
    if(argc != 2){
        fprintf(stderr, "We can't input multicast addr\n");
        exit(127);
    }

    cliaddr.sin_family = AF_INET;
    cliaddr.sin_port = htons(SERV_PORT);
    cliaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    bind(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
    //multicast
    mreq.imr_multiaddr.s_addr = inet_addr(argv[1]);
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);
 setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

    dg_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
    setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq));
    exit(0);
}
源代码分析如下:
0-18行:通过监听固定关端口和链接过来的任意IP(IPV4中为INADDR_ANY在IPv6中索引值为0)

19-21行:将多播地址加入struct ip_mreq的成员变量imr_multiaddr中, 网络接口表示为INADDR_ANY, 在ipv4中有内核自动选择分配。然后跳动IP_ADD_MEMBERSHIP把该主机加入加入多播组中。

22-25:当程序运行完后, 一定记住要将通过IP_DROP_MEMBERSHIP标志离开该多播组。


源代码2如下:

#include "unp.h"

void dg_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t pclilen)
{
    socklen_t len;
    int n;
    char recvbuf[MAXLINE + 1];
    const int on = 1;
    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); //SO_REUSEADDR套接字选项以允许这个程序的多个示例可以在同一个主机上面运行
    for(;;)
    {
        len = pclilen;
        n = recvfrom(sockfd, recvbuf, MAXLINE, 0, pcliaddr, &len);  
        if(n < 0){
            if(errno == EINTR) continue;
            else
                fprintf(stderr, "recvfrom error\n");
        }
        else{
            recvbuf[n] = 0;
//            Fputs(recvbuf, stdout);
            sendto(sockfd, recvbuf, n, 0, pcliaddr, len);
        }

    }
}


三、IPv4多播组选项

* 组成员无关多播套接字选项
   选项名                                                                数据类型                                                                        说明
IP_MULTICAST_LOOPu_char开启或者禁止外出多播数据报的回馈
IP_MULTICAST_TTLu_char指定外出多播数据报的TTL(time to life, 生存时间)
IP_MULTICAST_IFstruct in_addr指定外出多播数据报的默认接口


组成员相关多播套接字选项
选项数据类型
IP_ADD_MEMBERSHIPstruct ip_mreq                                     
IP_DROP_MEMBERISHIP struct ip_mreq                          


*本次试验仅仅演示了 IP_ADD_MEMBERSHIP和IP_DROP_MEMBERSHIP套接字选项

四、总结

1、如何加入和离开多播组
2、分析其中多播原理及其数据传播方向
3、了解多播与广播的区别, 和优缺点(主要还要了解广播数据的递送原理, 多播数据报的递送原理)。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值