欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-06 22:22:08
...

一、多播服务器

试验模型图:

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

试验内容:

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

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

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

运行结果如下:

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

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

源代码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_LOOP u_char 开启或者禁止外出多播数据报的回馈
IP_MULTICAST_TTL u_char 指定外出多播数据报的TTL(time to life, 生存时间)
IP_MULTICAST_IF struct in_addr 指定外出多播数据报的默认接口


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


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

四、总结

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