计算机网络课程设计-基于 IP 多播的网络会议程序

目录

前言

1 实验题目

2 实验目的

3 实验内容

3.1 步骤

3.2 关键代码

3.2.1 发送者

3.2.2 接收者

4 实验结果与分析

5 代码

5.1 发送者

5.2 接收者


前言

        本实验为计算机网络课程设计内容,基本上所有代码都是根据指导书给的附录写出来的。有些实验需要实现图形界面,但是出于期末考试压力,我所有实验均是在控制台输入输出的,没有花额外时间去学习qt了,有精力的同学可以自学一下qt实现简单的图形界面。同时,该博客内容为部分报告内容,仅为大家提供参考,请勿直接抄袭。另外,本次实验所用平台是dev c++5.11

        该实验需要配置一下防护墙和网络适配器,如果在操作系统课程设计时安装了vm虚拟机的,最好把两台电脑的vm网络适配器同时开启或者同时关闭。这个实验实际上我只是书上的代码跑了一下,但是因为我当时想去评一下优,而别人想评优的基本上都有界面,我没有,所以我就把这个实验也算上完成的了,拿数量来凑数了,有能力的同学尽力按要求完成做个图形界面

1 实验题目

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

2 实验目的

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

3 实验内容

3.1 步骤

        (1)初始化 WinSock2.2;

        (2)创建套接字并加入多播组;

        (3)发送者发送多播数据,并监听控制台输入,直到接收到 "QUIT" 命令;

        (4)接收者加入多播组,接收并打印多播数据,直到接收到 "QUIT" 为止。

3.2 关键代码

3.2.1 发送者

        (1)调用WSAJoinLeaf函数加入多播组

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;
	}

        (2)在发送端主要利用sendto(sockM,(char*)sendbuf,strlen(sendbuf),0,(struct sockaddr*)&remote,sizeof(remote))将数据发送到多播组中

//发送多播数据,当用户在控制台输入"QUIT"时退出。
while(1) {
		printf("SEND : ");
		scanf("%s",sendbuf);
		if( sendto(sockM,(char*)sendbuf,strlen(sendbuf),0,(struct sockaddr*)
		&remote,sizeof(remote))==SOCKET_ERROR) {
			printf("sendto failed with: %d\n",WSAGetLastError());
			closesocket(sockM);
			closesocket(sock);
			WSACleanup();
			return -1;
		}
		memset(sendBuf,'\0',128);
		cout<<sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(remote.sin_addr));
		cout<<"remote:"<<sendBuf<<"\n";
		if(strcmp(sendbuf,"QUIT")==0) break;
		Sleep(500);
	}

3.2.2 接收者

        (1)调用WSAJoinLeaf函数加入多播组

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;
	}

        (2)在接收端主要利用recvfrom(sock,recvbuf,BUFSIZE,0,(struct sockaddr*)&from,&len)函数从多播组中接收数据。

//接收多播数据,当接收到的数据为"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));
		}
	}

4 实验结果与分析

(1)在本机启动发送端加入多播组。

图1.1 发送端加入多播组

(2)在另一台主机上启动接收端加入多播组。

图1.2 接收端加入多播组

(3)在本机的发送端发送“你好,欢迎加入多播组!”,可以在另一台主机的接收端上收到相应的消息。

图1.3 发送端发送信息

图1.4 接收端成功接收到信息

5 代码

5.1 发送者

//sender.cpp
#include<bits/stdc++.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#define MCASTADDR "233.0.0.1" 	//本例使用的多播组地址。
#define MCASTPORT 5150 			//本地端口号。
#define BUFSIZE 1024 			//发送数据缓冲大小。
#pragma comment(lib,"ws2_32")

using namespace std;

int main( int argc,char ** argv) {
	WSADATA wsd;
	struct sockaddr_in remote,local,from;
	SOCKET sock,sockM;
	TCHAR sendbuf[BUFSIZE];
	int len = sizeof( struct sockaddr_in);
	//初始化 WinSock2.2
	if( WSAStartup( MAKEWORD(2,2),&wsd) != 0 ) {
		printf("WSAStartup() failed\n");
		return -1;
	}
	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;
	}

	//加入多播组
	remote.sin_family = AF_INET;
	remote.sin_port = htons(MCASTPORT);
	remote.sin_addr.s_addr = inet_addr( MCASTADDR );
	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;
	}
	char sendBuf[128];
	cout<<sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(local.sin_addr));
	cout<<"local:"<<sendBuf<<"\n";

	memset(sendBuf,'\0',128);
	cout<<sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(remote.sin_addr));
	cout<<"remote:"<<sendBuf<<"\n";

	//发送多播数据,当用户在控制台输入"QUIT"时退出。
	while(1) {
		printf("SEND : ");
		scanf("%s",sendbuf);
		if( sendto(sockM,(char*)sendbuf,strlen(sendbuf),0,(struct sockaddr*)
		           &remote,sizeof(remote))==SOCKET_ERROR) {
			printf("sendto failed with: %d\n",WSAGetLastError());
			closesocket(sockM);
			closesocket(sock);
			WSACleanup();
			return -1;
		}
		memset(sendBuf,'\0',128);
		cout<<sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(remote.sin_addr));
		cout<<"remote:"<<sendBuf<<"\n";
		
		if(strcmp(sendbuf,"QUIT")==0) break;
		Sleep(500);
	}

	closesocket(sockM);
	closesocket(sock);
	WSACleanup();
	return 0;
}

5.2 接收者

//receiver.cpp
#include<bits/stdc++.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#define MCASTADDR "233.0.0.1" //本例使用的多播组地址。
#define MCASTPORT 5150 //绑定的本地端口号。
#define BUFSIZE 1024 //接收数据缓冲大小。
#pragma comment(lib,"ws2_32")

using namespace std;
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.2
	if( 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;
	}
	char sendBuf[128];
	cout<<sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(local.sin_addr));
	cout<<"local:"<<sendBuf<<"\n";

	memset(sendBuf,'\0',128);
	cout<<sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(remote.sin_addr));
	cout<<"remote:"<<sendBuf<<"\n";
	//接收多播数据,当接收到的数据为"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;
}

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 计算机网络课程设计基于Packet Tracer的计算机网络建模研究是一项非常有意义的实践性课题。Packet Tracer是一款网络仿真软件,可模拟各种网络设备的功能和互动,是一个理想的计算机网络建模工具。该课题的研究目的是探究如何通过Packet Tracer对计算机网络进行建模分析。在这个过程中,我们需要掌握Packet Tracer软件的使用,并能够对常见的网络拓扑结构进行建模和模拟。 该课程设计网络拓扑设计入手,首先了解计算机网络拓扑结构及其功能,包括总线型、星型、树型、环型和网状型等拓扑结构。其次,需要掌握各种网络设备的基本功能和交互方式,包括路由器、交换机、集线器、网关等设备。 在进行网络建模与仿真时,我们可以通过Packet Tracer模拟网络设备的配置、互联、转发等操作,观察网络运行状态,分析网络性能和问题。例如,可以通过Packet Tracer建模并仿真一个树型网络结构,加入网络设备和主机,然后通过模拟数据传输的过程,验证网络的可靠性、稳定性和性能。 总之,通过这个课程设计,我们可以全面了解计算机网络的各种拓扑结构、设备和功能,同时还能够熟练使用Packet Tracer进行网络建模和仿真。这对于提高我们的计算机网络技能和实践能力都非常有益。同时,在网络建模与仿真的过程中,我们也可以发现和解决各种网络问题,为日后的网络设计和优化奠定基础。 ### 回答2: 计算机网络课程设计基于PacketTracer的计算机网络建模研究,是一项探索计算机网络技术的项目。该课程设计旨在通过PacketTracer这一工具,对计算机网络体系结构、协议、路由和安全等方面进行深入研究和模拟。 PacketTracer是一款仿真软件,帮助学生模拟计算机网络设计,使学生能够深入了解计算机网络的特点和工作原理。在这个课程设计中,学生可以尝试设计不同的协议、路由和拓扑,并使用PacketTracer进行调试和优化,以得到最佳结果。 此外,该课程设计还使学生了解到计算机网络的安全问题。学生可以通过PacketTracer模拟常见的网络攻击和防御措施,提高对网络安全的认识和理解。 在本项目的实践中,学生需要使用PacketTracer进行计算机网络的建模和仿真,通过对网络设计、路由器设置、拓扑构建、协议设计等方面的探索,加深对计算机网络相关知识的理解和掌握。 综上所述,该计算机网络课程设计基于PacketTracer的计算机网络建模研究,不仅能够帮助学生深入了解计算机网络技术,还能通过实践和探索,提高学生的计算机技术能力。 ### 回答3: 计算机网络课程设计基于packettracer的计算机网络建模研究涉及到计算机网络建模的理论与实践。PacketTracer是思科公司开发的一种网络建模软件,它可以模拟现实中电脑网络的各种环境,实现了传输控制协议(TCP)/因特网协议(IP)、动态主机配置协议(DHCP)、网际控制报文协议(ICMP)等协议的实现,能够较为真实地还原现实网络环境。在计算机网络课程设计中,使用PacketTracer进行网络建模可以帮助学生深入了解计算机网络的实现原理与过程,提高其对计算机网络中各种协议的理解和掌握能力。 具体来讲,计算机网络课程设计基于PacketTracer的计算机网络建模研究可以包括如下内容:网络拓扑设计网络协议的实现、虚拟化技术的实践、安全机制的应用等。在网络拓扑设计方面,可以帮助学生了解不同拓扑结构对网络性能的影响,如星型、总线型、环形等;在网络协议的实现方面,可以让学生通过实践模拟TCP/IP协议、路由协议等来深入了解其机制和实现过程;在虚拟化技术的实践方面,可以使学生掌握虚拟网络实现的方法,例如VLAN、VXLAN等;在安全机制的应用方面,可以通过模拟攻击和防御的实验,让学生学习并应用网络安全策略和技术。 总之,通过计算机网络课程设计基于PacketTracer的计算机网络建模研究,可以有效地提高学生对计算机网络相关知识的学习理解和应用能力,有助于他们将课程中学到的知识转化为实际的技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值