基于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_MEMBERSHIP和IP_DROP_MEMBERSHIP套接字选项
四、总结
1、如何加入和离开多播组
2、分析其中多播原理及其数据传播方向
3、了解多播与广播的区别, 和优缺点(主要还要了解广播数据的递送原理, 多播数据报的递送原理)。
阅读全文
0 0
- 基于UDP的C/S多播回射服务器
- [C语言]基于UDP的基本C/S模型
- 基于UDP的 C/S模式 网络应用程序
- 一个简单基于UDP的回显C/S(一)
- 一个基于UDP的回显C/S(二)
- DeviceAnywhere,基于UDP协议的手机计算机C/S结构软件, 附源码
- Linux下基于UDP协议的C/S通信编程笔记
- socket编程 -- 基于UDP协议的C/S通信模型及实现
- windwos平台下C++实现一个基于UDP的C/S模式通信示例
- 基于UDP的C/S网络编程模型(使用sendto和recvfrom函数)
- 基于UDP协议的Socket服务器
- 基于LwIP socket的UDP服务器
- 基于UDP协议的服务器/客户端程序
- 基于UDP协议的服务器/客户端程序
- 基于UDP的nio日志服务器
- 基于UDP的回声服务器/客户端
- 基于UDP协议的服务器/客户端
- 计算机网络基于UDP的服务器和客户端
- LIS-最长递增子序列的长度-java
- 设计模式之类对象结构型 — BRIDGE (桥接)模式
- Jmeter-BeanShell的使用介绍
- MOOC清华《程序设计基础》第8章:二进制文件的数据存取
- 读取word
- 基于UDP的C/S多播回射服务器
- 微信公众平台 java 处理消息 3
- spring boot 启动错误:Could not resolve placeholder
- 《利用Python进行数据分析》笔记---第4章NumPy基础:数组和矢量计算
- POJ 3252(数位DP || 组合数)
- 对象与类基础
- 下载faceScrub人脸数据库 (多线程版本)
- c++ 有什么好书推荐?
- 多播地址基础