基于UDP的C/S多播回射服务器
程序员文章站
2022-07-06 22:22:08
...
一、多播服务器
试验模型图:
试验内容:
本次试验是在两台在同一个子网的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_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、了解多播与广播的区别, 和优缺点(主要还要了解广播数据的递送原理, 多播数据报的递送原理)。