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

来源:互联网 发布:知乎搞笑问答 编辑:程序博客网 时间:2024/06/01 17:12

一、多播服务器

试验模型图:


试验内容:

本次试验是在两台在同一个子网的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、了解多播与广播的区别, 和优缺点(主要还要了解广播数据的递送原理, 多播数据报的递送原理)。