前言

本实验难点在于环境的配置,尤其是多网卡配置,经过查阅资料和多次小伙伴们测试,最后终于找到问题的根源
问题分析和配置主要放在实验结果与分析栏中
结尾附上指导书的IP多播源码

白嫖容易,创作不易,本文原创,转载请注明!!!
源码和可运行程序:
链接:https://pan.baidu.com/s/1A9KctmpP2JJgyW2wLrehIg
提取码:Lin2

计算机网络课程设计:
计算机网络课程设计之网络聊天程序的设计与实现
计算机网络课程设计之Tracert与Ping程序设计与实现
计算机网络课程设计之基于 IP 多播的网络会议程序
计算机网络课程设计之网络嗅探器的设计与实现
计算机网络课程设计之电子邮件客户端程序设计与实现
计算机网络课程设计之TELNET 终端设计与实现
计算机网络课程设计之网络代理服务器的设计与实现
计算机网络课程设计之简单 Web Server 程序的设计与实现

Qt入门系列:
Qt学习之C++基础
Qt学习之Qt安装
Qt学习之Qt基础入门(上)
Qt学习之Qt基础入门(中)
Qt学习之Qt基础入门(下)

创作不易,整个课程设计程序3000多行代码,所有实验都写在了一个程序中,时间有限,能力不足,转载望注明!!!
本文链接
个人博客:https://ronglin.fun/archives/268
PDF链接:见博客网站
CSDN: https://blog.csdn.net/RongLin02/article/details/122510355

实验题目

基于 IP 多播的网络会议程序

实验目的

参照附录 3 的局域网 IP 多播程序,设计一个图形界面的网络会议程序(实现文本多播方式即可)

总体设计

(含背景知识或基本原理与算法、或模块介绍、设计步骤等)
本题的代码主要根据指导书的代码改编。

发送方

发送方重点代码就是加入多播组

//创建套接字sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_MULTIPOINT_C_LEAF|    WSA_FLAG_MULTIPOINT_D_LEAFWSA_FLAG_OVERLAPPED);
//加入多播组remote.sin_family = AF_INET;remote.sin_port = htons(MCASTPORT);remote.sin_addr.s_addr = inet_addr( MCASTADDR );sockM = WSAJoinLeaf(sock,(SOCKADDR*)&remote,sizeof(remote),NULL,NULL,NULL,NULL,JL_BOTH)) == INVALID_SOCKET);

之后就用sendto方法发送数据即可

接收方

接收方主要是监听对应的地址和端口

    sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET);//将 sock 绑定到本机某端口上。local.sin_family = AF_INET;local.sin_port = htons(MCASTPORT);local.sin_addr.s_addr = INADDR_ANY;bind(sock,(struct sockaddr*)&local,sizeof(local));//加入多播组remote.sin_family = AF_INET;remote.sin_port = htons(MCASTPORT);remote.sin_addr.s_addr = inet_addr( MCASTADDR );/* Winsock2.0*/sockM = WSAJoinLeaf(sock,(SOCKADDR*)&remote,sizeof(remote),NULL,NULL,NULL,NULL,JL_BOTH));

之后接收方用recvfrom方法即可收到数据

部分背景知识

并不是所有的协议都支持多播通信,对 Win32 平台而言,仅两种可从 WinSock 内访问的协议(IP/ATM)才提供了对多播通信的支持。因通常通信应用都建立在 TCP/IP 协议之上的,所以本文只针对 IP 协议来探讨多播通信技术。
IP 采用 D 类地址来支持多播。当一个进程向一个 D 类地址发送分组时,会尽最大的努力将它送给小组的所有成员,但不能保证全部送到。
D 类 I P地址范围在 224.0.0.0 到 239.255.255.255 之间。
部分永久地址说明

224.0.0.0 基本地址(保留)
224.0.0.1 子网上的所有系统
224.0.0.2 子网上的所有路由器
224.0.0.5 子网上所有 OSPF 路由器
224.0.0.6 子网上所有指定的 OSPF 路由器
224.0.0.9 RIP 第 2 版本组地址
224.0.1.1 网络时间协议
224.0.1.24 WINS 服务器组地址

多播由特殊的多播路由器来实现,多播路由器同时也可以是普通路由器。各个多播路由器每分钟发送一个硬件多播信息给子网上的主机(目的地址为 224.0.0.1),要求它们报告其进程当前所属的是哪一组,各主机将它感兴趣的 D 类地址返回。这些询问和响应分组使用 IGMP(Internet group management protocol),它大致类似于 ICMP。它只有两种分组:询问和响应,都有一个简单的固定格式,其中有效载荷字段的第一个字段是一些控制信息,第二字段是一个 D 类地址,在 RFC1112 中有详细说明。

详细设计

(含主要的数据结构、程序流程图、关键代码等)
界面如下

主要是一个大的部分用来显示数据交互,然后让用户输入多播地址,注意根据背景知识,多播地址应为D类IP地址,然后端口无所谓,端口需要注意,发送者的端口要和接收者的端口一致,但是如果同一台主机又作为发送者又作为接收者的话,两个身份的端口是可以不同的。
换言之,就是接收者只会接收到它自己监听的端口数据,发送者也只会发送数据给对应的端口。
这和TCP连接不同,TCP连接一个客户端既能发送也能接受,但是多播不一样,可以只有发送和接受的单一功能。

为了实现多播,我将发送者和接受者的端口设置为同一个,表示既发送又接受
同时多播也用一个子线程,因为要监听接受数据,这是一个阻塞式的方法
同时提供一个检测ip合法的一个方法

//检测用户输入是否合法
static bool isLegalIP(QString ip);

然后把所有的功能写入了run()方法

实验结果与分析

明明代码是对的,为什么就是收不到数据!!!
这里提供一些思路。
首先提供一个指令,打开CMD,输入这条指令

netsh interface ipv4 show joins


可以看到,我们设置的224.1.0.1多播地址在网卡接口 19: 以太网
然后打开电脑的设置->网络和Internet->更改适配器选项,然后弹出来一个界面

把自己不需要的网卡给禁了,然后,双击自己连接局域网的网卡,我这里就是以太网(网线)

点击详细信息,然后看到IPV4地址然后在代码中,加入多播组的Socket需要是这个地址

然后把主机的防火墙关闭,关闭的方式网上有很多的方法,这里不再说明。
最后说明的一点就是,自己设置的多播地址一定要在连接局域网的网卡上转发通过netsh interface ipv4 show joins可以查看

然后就是结果展示,找到另外一名小伙伴,让他也加入多播地址(运行的程序的种类可以不同),然后输入相同的多播地址和端口,设置好对应的本地网卡地址,然后就可以愉快的玩耍了。

小伙伴的电脑显示

小结与心得体会

对于IP多播有了更深的理解,同时有了一种局域网相互交换数据的思路,同时可以利用IP多播可以设置一个多人聊天室,类似于飞秋的多人聊天功能,在局域网上面学到了很多知识。
=w=

附多播源码

sender源码

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#define MCASTADDR "224.1.0.1" //本例使用的多播组地址。
#define MCASTPORT 23333 //绑定的本地端口号。
#define BUFSIZE 1024 //接收数据缓冲大小。
#pragma comment(lib,"ws2_32")
int main( int argc,char ** argv)
{WSADATA wsd;struct sockaddr_in local,remote,from;SOCKET sock,sockM;TCHAR recvbuf[BUFSIZE];/*struct ip_mreq mcast; // Winsock1.0 */int len = sizeof( struct sockaddr_in);int ret;
//初始化 WinSock2.2if( WSAStartup( MAKEWORD(2,2),&wsd) != 0 ){printf("WSAStartup() failed\n");return -1;}/*创建一个 SOCK_DGRAM 类型的 SOCKET其中,WSA_FLAG_MULTIPOINT_C_LEAF 表示 IP 多播在控制面层上属于"无根"类型;WSA_FLAG_MULTIPOINT_D_LEAF 表示 IP 多播在数据面层上属于"无根",有关控制面层和数据面层有关概念请参阅 MSDN 说明。*/if((sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET){printf("socket failed with:%d\n",WSAGetLastError());WSACleanup();return -1;}
//将 sock 绑定到本机某端口上。local.sin_family = AF_INET;local.sin_port = htons(MCASTPORT);local.sin_addr.s_addr = INADDR_ANY;if( bind(sock,(struct sockaddr*)&local,sizeof(local)) == SOCKET_ERROR ){printf( "bind failed with:%d \n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}
//加入多播组remote.sin_family = AF_INET;remote.sin_port = htons(MCASTPORT);remote.sin_addr.s_addr = inet_addr( MCASTADDR );/* Winsock1.0 *//*mcast.imr_multiaddr.s_addr = inet_addr(MCASTADDR);mcast.imr_interface.s_addr = INADDR_ANY;if( setsockopt(sockM,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&mcast,sizeof(mcast)) == SOCKET_ERROR){printf("setsockopt(IP_ADD_MEMBERSHIP) failed:%d\n",WSAGetLastError());closesocket(sockM);WSACleanup();return -1;}*//* Winsock2.0*/if(( sockM = WSAJoinLeaf(sock,(SOCKADDR*)&remote,sizeof(remote),NULL,NULL,NULL,NULL,JL_BOTH)) == INVALID_SOCKET){printf("WSAJoinLeaf() failed:%d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}
//接收多播数据,当接收到的数据为"QUIT"时退出。while(1){if(( ret = recvfrom(sock,recvbuf,BUFSIZE,0,(struct sockaddr*)&from,&len)) == SOCKET_ERROR){printf("recvfrom failed with:%d\n",WSAGetLastError());closesocket(sockM);closesocket(sock);WSACleanup();return -1;}if( strcmp(recvbuf,"QUIT") == 0 )break;else{recvbuf[ret] = '\0';printf("RECV:' %s ' FROM <%s> \n",recvbuf,inet_ntoa(from.sin_addr));}}closesocket(sockM);closesocket(sock);WSACleanup();return 0;
}

receiver源码

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#define MCASTADDR "224.1.0.1" //本例使用的多播组地址。
#define MCASTPORT 23333 //绑定的本地端口号。
#define BUFSIZE 1024 //接收数据缓冲大小。
#pragma comment(lib,"ws2_32")
int main( int argc,char ** argv)
{WSADATA wsd;struct sockaddr_in local,remote,from;SOCKET sock,sockM;TCHAR recvbuf[BUFSIZE];/*struct ip_mreq mcast; // Winsock1.0 */int len = sizeof( struct sockaddr_in);int ret;
//初始化 WinSock2.2if( WSAStartup( MAKEWORD(2,2),&wsd) != 0 ){printf("WSAStartup() failed\n");return -1;}/*创建一个 SOCK_DGRAM 类型的 SOCKET其中,WSA_FLAG_MULTIPOINT_C_LEAF 表示 IP 多播在控制面层上属于"无根"类型;WSA_FLAG_MULTIPOINT_D_LEAF 表示 IP 多播在数据面层上属于"无根",有关控制面层和数据面层有关概念请参阅 MSDN 说明。*/if((sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET){printf("socket failed with:%d\n",WSAGetLastError());WSACleanup();return -1;}
//将 sock 绑定到本机某端口上。local.sin_family = AF_INET;local.sin_port = htons(MCASTPORT);local.sin_addr.s_addr = INADDR_ANY;if( bind(sock,(struct sockaddr*)&local,sizeof(local)) == SOCKET_ERROR ){printf( "bind failed with:%d \n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}
//加入多播组remote.sin_family = AF_INET;remote.sin_port = htons(MCASTPORT);remote.sin_addr.s_addr = inet_addr( MCASTADDR );/* Winsock1.0 *//*mcast.imr_multiaddr.s_addr = inet_addr(MCASTADDR);mcast.imr_interface.s_addr = INADDR_ANY;if( setsockopt(sockM,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&mcast,sizeof(mcast)) == SOCKET_ERROR){printf("setsockopt(IP_ADD_MEMBERSHIP) failed:%d\n",WSAGetLastError());closesocket(sockM);WSACleanup();return -1;}*//* Winsock2.0*/if(( sockM = WSAJoinLeaf(sock,(SOCKADDR*)&remote,sizeof(remote),NULL,NULL,NULL,NULL,JL_BOTH)) == INVALID_SOCKET){printf("WSAJoinLeaf() failed:%d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}
//接收多播数据,当接收到的数据为"QUIT"时退出。while(1){if(( ret = recvfrom(sock,recvbuf,BUFSIZE,0,(struct sockaddr*)&from,&len)) == SOCKET_ERROR){printf("recvfrom failed with:%d\n",WSAGetLastError());closesocket(sockM);closesocket(sock);WSACleanup();return -1;}if( strcmp(recvbuf,"QUIT") == 0 )break;else{recvbuf[ret] = '\0';printf("RECV:' %s ' FROM <%s> \n",recvbuf,inet_ntoa(from.sin_addr));}}closesocket(sockM);closesocket(sock);WSACleanup();return 0;
}

计算机网络课程设计之基于 IP 多播的网络会议程序相关推荐

  1. 计算机网络——基于IP多播的网络会议程序

    计算机网络--基于IP多播的网络会议程序 一.实验目的 二.总体设计 1. 基本原理 2. 设计步骤 (1)receiver (2)sender 三.详细设计 1. 程序流程图 2. 实验代码 (1) ...

  2. 基于C++的Qt网络编程——基于 IP 多播的网络会议程序

    目录 一.实验题目 二.实验目的 三.总体设计 1.实验原理 2.设计步骤 四.详细设计 1.程序流程图 2.实验代码(部分) 五.实验结果与分析 六.小结与心得体会 一.实验题目 基于 IP 多播的 ...

  3. python网络爬虫课程设计题目_山东建筑大学计算机网络课程设计《基于Python的网络爬虫设计》...

    山东建筑大学计算机网络课程设计<基于Python的网络爬虫设计> 山东建筑大学 课 程 设 计 成 果 报 告 题 目: 基于Python的网络爬虫设计 课 程: 计算机网络A 院 (部) ...

  4. 计算机网络课程设计即时通讯,计算机网络课程设计报告-基于LAN的即时通信软件.doc...

    一.概述 1.1 设计目的: 利用MFC编程实现客户端之间通过服务器进行通信. 1.2 设计内容: 网络通信软件的数据通信是通过网络套接字进行的.根据该原理,其编程步骤应分为创建套接字.在套接字上进行 ...

  5. 计算机网络课程设计之简单 Web Server 程序的设计与实现

    前言 本实验是实现一个简易的webserver,我们一直在访问网站,甚至还做过Web课程设计,部署过Tomcat等等,所以说这次实验能更深入的了解其原理 白嫖容易,创作不易,本文原创,转载请注明!!! ...

  6. 计算机网络课程设计之网络代理服务器的设计与实现

    前言 本实验因为时间有限,写的比较草率... 白嫖容易,创作不易,本文原创,转载请注明!!! 源码和可运行程序: 链接:https://pan.baidu.com/s/1A9KctmpP2JJgyW2 ...

  7. 计算机网络课程设计之TELNET 终端设计与实现

    前言 Telnet设计是一个比较麻烦的东东,因为Telnet服务器需要部署,而且网络上的资料比较少,最后通过在云服务器CentOS上安装Telnet服务器然后自己的程序作为一个Telnet客户端测试成 ...

  8. 计算机网络课程设计之电子邮件客户端程序设计与实现

    前言 本实验主要是用smtp协议发邮件,收邮件要用到POP3,时间有限,只实现了发邮件,实现过程放在总体设计中 白嫖容易,创作不易,本文原创,转载请注明!!! 源码和可运行程序: 链接:https:/ ...

  9. 计算机网络课程设计之网络嗅探器的设计与实现

    前言 本实验难点是在于Windows下的raw socket有太多的限制,因此用winpcap编程功能更加强大,但是根据指导书要求要用原始套接字,原始套接字在Linux系统下也十分强大,结尾附上Lin ...

最新文章

  1. 测试CH340C的功能,制作MicroPython ESP8266,ESP32下载器
  2. javarxtx串口接收时数据会分成好几段_【STM32】串口通信基本原理(超基础、详细版)...
  3. 解决冲突的拉链法探测的ASL
  4. for语句的执行过程_带你深入了解Java流程控制语句
  5. 关于持续集成,质量管理,工具等
  6. 紫书搜索 例题7-10 UVA - 11212 Editing a Book 迭代加深搜索 IDA*
  7. mongodb与mysql命令对比
  8. java null错误事例_java – aspectJ示例中的nullpointer异常
  9. Mysql 零距离-入门(六)数据唯一约束性
  10. Eclipse下Maven工程多模块继承和聚合的创建
  11. spss多元线性回归散点图_SPSS线性回归|别人不想告诉你的其他操作我都总结好了(中)...
  12. 带修改离线主席树 + 树状数组 ZOJ - 2112【Dynamic Rankings】
  13. db2 sqlcode
  14. 论文查重率【降重】从65%-25%的心路历程!超硬核!霸道降重!
  15. torch/utils/cpp_extension.py raise RuntimeError(message) from e
  16. GitHub中国区前100名到底是什么样的人?向大佬们学习。
  17. Verilog基础知识-——计数器设计以及任意分频设计与modelsim仿真
  18. gin框架下参数的自定义验证小示例
  19. Android 开发之上传图片
  20. 爬虫破解js加密破解(二) 有道词典js加密参数 sign破解

热门文章

  1. Eclipse rap 富客户端开发总结(14) :rap 图片、数据缓存处理
  2. 第二篇 Python图片处理模块PIL(pillow)
  3. 一个持续6年的针对多国政府机构的网络间谍活动 — “美人鱼行动”
  4. 解决Eclipse 项目报错:Unbound classpath container: ‘JRE System Library [JavaSE-1.7]
  5. 求之不得的 Java 文档教程大汇总!
  6. 程序员工资那么高,却不知道怎么花?程序员花钱指南了解一下!
  7. 论优秀的码农,学会这5点!
  8. 老板眼中理想的“数据中台”,是不是真的存在?
  9. 针对C++最主要的优势就是没有指针
  10. eNet 软件发布要求多多