网络通信day5作业

news2024/12/27 19:48:51

1>    使用select完成TCP客户端程序

客户端:

#include<myhead.h>

#define FPORT 9999
#define FIP "192.168.125.130"

#define KPORT 6666
#define KIP "192.168.125.130"

int main(int argc, const char *argv[])
{
	//创建套接字文件描述符
	int cfd = 0;
	if((cfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
	{
		perror("socket error");
		return -1;
	}
	//允许重复引用
	int reuse = 1;
	if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)
	{
		perror("setsockopt error");
		return -1;
	}

	//绑定客服端
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(KPORT);
	sin.sin_addr.s_addr = inet_addr(KIP);
	if(bind(cfd,(struct sockaddr*)&sin,sizeof(sin)) == -1)
	{
		perror("bind error");
		return -1;
	}

	//连接服务器
	struct sockaddr_in cin;
	cin.sin_family = AF_INET;
	cin.sin_port = htons(FPORT);
	cin.sin_addr.s_addr = inet_addr(FIP);

	if(connect(cfd,(struct sockaddr*)&cin,sizeof(cin)) == -1)
	{
		perror("connect");
		return -1;
	}

	//定义检测文件描述符的集合
	fd_set readfd;

	//清空集合
	FD_ZERO(&readfd);

	//将cfd和0加入集合
	FD_SET(cfd,&readfd);
	FD_SET(0,&readfd);

	char buf[128] = "";
	int res = -1;

	fd_set tempfd;

	while(1)
	{
		tempfd = readfd;
		res = select(cfd+1,&tempfd,NULL,NULL,NULL);
		if(res < 0)
		{
			perror("select error");
			return -1;
		}else if(res == 0)
		{
			printf("time out\n");
			return -1;
		}
		//下面为处理的处理描述符
		if(FD_ISSET(0,&tempfd))
		{
			bzero(buf,sizeof(buf));

			fgets(buf,sizeof(buf),stdin);
			buf[strlen(buf)-1]=0;

			send(cfd,buf,sizeof(buf),0);
			printf("客服端输入为%s\n",buf);
		}



		if(FD_ISSET(cfd,&tempfd))
		{
			bzero(buf,sizeof(buf));

			int res = recv(cfd,buf,sizeof(buf),0);
			if(res == 0)
			{
				printf("服务器下线\n");
				break;
			}
			printf("服务器发来的消息为%s\n",buf);
		}
	}

	close(cfd);


	return 0;
}

服务器:

#include<myhead.h>
#define PORT 9999
#define IP "192.168.125.130"

int main(int argc, const char *argv[])
{
	int sfd = -1;
	if((sfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
	{
		perror("socket");
		return -1;
	}
	
	int reuse = 1;
	if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)
	{
		perror("setsockopt error");
		return -1;
	}

	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = inet_addr(IP);
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) == -1)
	{
		perror("bind error");
		return -1;
	}

	if(listen(sfd,128)  == -1)
	{
		perror("listen error");
		return -1;
	}

	struct sockaddr_in cin;
	socklen_t socklen = sizeof(cin);

	int newfd = -1;
	char buf[128] = "";

	fd_set readfds;

	FD_ZERO(&readfds);

	FD_SET(sfd,&readfds);
	FD_SET(0,&readfds);

	int res = 0;
	fd_set tempfds;

	int maxfd = sfd;

	char rbuf[128]="";

	struct sockaddr_in arr_cin[1024];

	while(1)
	{
		tempfds = readfds;

		res = select(maxfd+1,&tempfds,NULL,NULL,NULL);
		if(res == -1)
		{
			perror("select error");
			return -1;
		}else if(res == 0)
		{
			printf("time out\n");
			return -1;
		}

		for(int index=0;index<=maxfd;index++)
		{
			if(!FD_ISSET(index,&tempfds))
			{
				continue;
			}

			if(index == sfd)
			{
				if((newfd = accept(sfd,(struct sockaddr*)&cin,&socklen)) == -1)
				{
					perror("accept");
					return -1;
				}
				arr_cin[newfd] =cin;
				printf("[%s:%d]链接成功,newfd = %d\n\n",inet_ntoa(arr_cin[newfd].sin_addr),ntohs(arr_cin[newfd].sin_port),newfd);

				FD_SET(newfd,&readfds);
				if(newfd > maxfd)
				{
					maxfd = newfd;
				}
			}else if(index == 0)
			{
				scanf("%s",buf);
				printf("%s\n",buf);
			}else
			{
				bzero(rbuf,sizeof(rbuf));

				int res = recv(index,rbuf,sizeof(rbuf),0);
				if(res == 0)
				{
					printf("客户端下线\n");

					close(index);

					FD_CLR(index,&readfds);

					for(int i =maxfd;i>0;i--)
					{
						if(FD_ISSET(i,&readfds))
						{
							maxfd = i;
							break;
						}
					}
					continue;
				}
				printf("[%s:%d] :%s\n",inet_ntoa(arr_cin[index].sin_addr),ntohs(arr_cin[index].sin_port),rbuf);
				strcat(rbuf,"*_*");
				send(index,rbuf,sizeof(rbuf),0);
			}
		}
	}

	close(sfd);

	return 0;
}

效果图:


2>    使用poll完成TCP并发服务器

客户端:

#include<myhead.h>
#define SERPORT 9999
#define SERIP "192.168.125.130"

#define CLIPORT 6666
#define CLIIP "192.168.125.130"


int main(int argc, const char *argv[])
{
	int cfd = -1;
	if((cfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
	{
		perror("socket error");
		return -1;
	}
	printf("cfd = %d\n",cfd);

	int reuse = 1;
	if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)
	{
		perror("setsockopt error");
		return -1;
	}
	
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(CLIPORT);
	sin.sin_addr.s_addr = inet_addr(CLIIP);

	if(bind(cfd,(struct sockaddr*)&sin,sizeof(sin)) == -1)
	{
		perror("bind error");
		return -1;
	}

	struct sockaddr_in cin;
	cin.sin_family = AF_INET;
	cin.sin_port = htons(SERPORT);
	cin.sin_addr.s_addr = inet_addr(SERIP);

	if(connect(cfd,(struct sockaddr*)&cin,sizeof(cin)) == -1)
	{
		perror("connect error");
		return -1;
	}

	struct pollfd fds[2];
	fds[0].fd = 0;
	fds[0].events = POLLIN;

	fds[1].fd = cfd;
	fds[1].events = POLLIN;

	int res = -1;

	char wbuf[128] = "";
	while(1)
	{
		res = poll(fds,2,-1);
		if(res < 0)
		{
			perror("poll error");
			return -1;
		}else if(res == 0)
		{
			printf("time out \n");
			return -1;
		}
		if(fds[0].revents == POLLIN)
		{
			bzero(wbuf,sizeof(wbuf));

			fgets(wbuf,sizeof(wbuf),stdin);
			wbuf[strlen(wbuf)-1]=0;

			send(cfd,wbuf,sizeof(wbuf),0);

		}

		if(fds[1].revents == POLLIN)
		{
			bzero(wbuf,sizeof(wbuf));

			int res = recv(cfd,wbuf,sizeof(wbuf),0);
			if(res == 0)
			{
				printf("服务器已下线\n");
				break;
			}
			printf("[%s:%d]:%s\n",SERIP,SERPORT,wbuf);
		}
	}
	close(cfd);






	return 0;
}

服务器:

#include<myhead.h>

#define PORT 9999
#define IP "192.168.125.130"


int main(int argc, const char *argv[])
{
	//定义套接字文件描述符
	int cfd = -1;
	if((cfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
	{
		perror("socket error");
		return -1;
	}
	//端口快速重用
	int reuse = 1;
	if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)
	{
		perror("setsockopt error");
		return -1;
	}
	//绑定服务器套接字信息并连接
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = inet_addr(IP);

	if(bind(cfd,(struct sockaddr*)&sin,sizeof(sin)) == -1)
	{
		perror("bind error");
		return -1;
	}
	//设置为监听状态
	if(listen(cfd,128) == -1)
	{
		perror("listen error");
		return -1;
	}

	//要检测的文件描述符集合对应的数组
	struct pollfd fds[1024];
	//定义客户端信息
	struct sockaddr_in add_cin[1024];

	//标准0
	fds[0].fd = 0;
	fds[0].events = POLLIN;

	//标准cfd
	fds[cfd].fd = cfd;
	fds[cfd].events = POLLIN;

	struct sockaddr_in cin;
	socklen_t socklen = sizeof(cin);


	int newfd = -1;
	int res = -1;
	int size = 4;//初始成员个数
	char buf[128]="";
	while(1)
	{
		res = poll(fds,size,-1);
		if(res == -1)
		{
			perror("poll error");
			return -1;
		}else if(res == 0)
		{
			printf("time out\n");
			return -1;
		}

		for(int index=0;index<1024;index++)
		{
			if(fds[index].revents != POLLIN)
			{
				continue;
			}

			if(fds[cfd].revents == POLLIN)
			//if((fds[index].revents == POLLIN)&&(fds[index].fd == cfd))
			{
				//到此下面为操作文件描述符
				//设置为等待连接状态

				if((newfd = accept(cfd,(struct sockaddr*)&cin,&socklen)) == -1)
				{
					perror("accept error");
					return -1;
				}
				//客户端加入数组
				add_cin[newfd]=cin;
				fds[size].fd = newfd;
				fds[size].events = POLLIN;
				size++;
				//printf("连接成功\n");
				printf("[%s,%d]连接成功,newfd=%d\n",inet_ntoa(add_cin[newfd].\
							sin_addr),ntohs(add_cin[newfd].sin_port),newfd);

			}
			else if((fds[index].revents == POLLIN)&&fds[index].fd == 0)
			{
				bzero(buf,sizeof(buf));
				//终端输入
				fgets(buf,sizeof(buf),stdin);
				buf[strlen(buf)-1] = 0;

				printf("服务器输入为%s\n",buf);

			}
			else 
			{
				bzero(buf,sizeof(buf));

				int resa = recv(fds[index].fd,buf,sizeof(buf),0);
				if(resa == 0)
				{
					printf("客户端下线\n");
					close(fds[index].fd);
					fds[index] = fds[size];
					size--;
					continue;
				}
				printf("[%s,%d]发送%s\n",inet_ntoa(add_cin[newfd].sin_addr),\
						ntohs(add_cin[newfd].sin_port),buf);
				strcat(buf,"*_*");
				send(fds[index].fd,buf,sizeof(buf),0);
			}
		}
	}


	return 0;
}

 服务器:

#include<myhead.h>

#define PORT 9999
#define IP "192.168.125.130"


int main(int argc, const char *argv[])
{
	//定义套接字文件描述符
	int cfd = -1;
	if((cfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
	{
		perror("socket error");
		return -1;
	}
	//端口快速重用
	int reuse = 1;
	if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)
	{
		perror("setsockopt error");
		return -1;
	}
	//绑定服务器套接字信息并连接
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = inet_addr(IP);

	if(bind(cfd,(struct sockaddr*)&sin,sizeof(sin)) == -1)
	{
		perror("bind error");
		return -1;
	}
	//设置为监听状态
	if(listen(cfd,128) == -1)
	{
		perror("listen error");
		return -1;
	}

	//要检测的文件描述符集合对应的数组
	struct pollfd fds[1024];
	//定义客户端信息
	struct sockaddr_in add_cin[1024];

	//标准0
	fds[0].fd = 0;
	fds[0].events = POLLIN;

	//标准cfd
	fds[cfd].fd = cfd;
	fds[cfd].events = POLLIN;

	struct sockaddr_in cin;
	socklen_t socklen = sizeof(cin);


	int newfd = -1;
	int res = -1;
	int size = 4;//初始成员个数
	char buf[128]="";
	while(1)
	{
		res = poll(fds,size,-1);
		if(res == -1)
		{
			perror("poll error");
			return -1;
		}else if(res == 0)
		{
			printf("time out\n");
			return -1;
		}

		for(int index=0;index<1024;index++)
		{
			if(fds[index].revents != POLLIN)
			{
				continue;
			}

			if(fds[cfd].revents == POLLIN)
			{
				//到此下面为操作文件描述符
				//设置为等待连接状态

				if((newfd = accept(cfd,(struct sockaddr*)&cin,&socklen)) == -1)
				{
					perror("accept error");
					return -1;
				}
				//客户端加入数组
				add_cin[newfd]=cin;
				fds[newfd].fd = newfd;
				fds[newfd].events = POLLIN;
				size++;
				//printf("连接成功\n");
				printf("[%s,%d]连接成功,newfd=%d\n",inet_ntoa(add_cin[newfd].\
							sin_addr),ntohs(add_cin[newfd].sin_port),newfd);

			}
			else if((fds[index].revents == POLLIN)&&fds[index].fd == 0)
			{
				bzero(buf,sizeof(buf));
				//终端输入
				fgets(buf,sizeof(buf),stdin);
				buf[strlen(buf)-1] = 0;

				printf("服务器输入为%s\n",buf);

			}
			else 
			{
				bzero(buf,sizeof(buf));

				int resa = recv(fds[index].fd,buf,sizeof(buf),0);
				if(resa == 0)
				{
					printf("客户端下线\n");
					close(fds[index].fd);
					//fds[index] = fds[size];
					//size--;
					continue;
				}
				printf("[%s,%d]发送%s\n",inet_ntoa(add_cin[newfd].sin_addr),\
						ntohs(add_cin[newfd].sin_port),buf);
				strcat(buf,"*_*");
				send(fds[index].fd,buf,sizeof(buf),0);
			}
		}
	}


	return 0;
}

效果图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1326970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于EasyExcel 合并单元格方法该如何实现

在做一个业务的导出&#xff0c;目前遇到一个需求&#xff0c;如下图&#xff1a; import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.metad…

美好蕴育润康真的对孕妇好吗?有效吗?

在孕期&#xff0c;孕妇的营养摄入对于胎儿的健康发育至关重要。因此&#xff0c;选择一款合适的孕期营养补充品成为了许多孕妇关注的焦点。美好蕴育润康作为一款备受推崇的孕期营养补充品&#xff0c;究竟是否真的对孕妇有益&#xff0c;是否有效呢&#xff1f; 首先&#xff…

数据治理与大模型一体化实践

引言: 大模型落地到当前这个阶段&#xff0c;核心关注点还是领域大模型&#xff0c;而领域大模型落地的前提在于两点&#xff1a;需求端&#xff0c;对当前应用的降本增效以及新应用的探索&#xff1b;供给端&#xff0c;训练技术已经有较高的成熟度。 专家介绍&#xff1a; …

【C语言】指针详解(一)

目录 1.内存和地址 1.1内存 1.2如何理解编址 2.指针变量和地址 2.1取地址操作符&#xff08;&&#xff09; 2.2指针变量和解引用操作符&#xff08;*&#xff09; 2.2.1指针变量 2.2.2拆解指针类型 2.2.3解引用操作符 2.3指针变量大小 1.内存和地址 1.1内存 在讲内…

HarmonyOS引导页登陆页以及tabbar的代码说明1

效果 以下代码是东拼西凑出来的。只是为了个人熟悉一下相关模块的使用&#xff1a; 用的知识点&#xff1a; Resouces 此部分分内容可以在项目中找到&#xff1a; resources/base/element/color.json 为项目着色配置&#xff0c;当然也可以正接在代码里写 float.json 为相关…

如何实现免费无限流量云同步笔记软件Obsidian?

目录 前言 如何实现免费无限流量云同步笔记软件Obsidian&#xff1f; 一、简介 软件特色演示&#xff1a; 二、使用免费群晖虚拟机搭建群晖Synology Drive服务&#xff0c;实现局域网同步 1 安装并设置Synology Drive套件 2 局域网内同步文件测试 三、内网穿透群晖Synol…

上海三思立体育苗系统Vertical X打造“不见光”人工农场

最早的人工育苗可追溯到农耕文明的起源。 人类通过筛选种子、选择播种时机和使用肥料等方式&#xff0c;达到提升产量的效果。随着农业技术发展&#xff0c;育苗床和育苗盆等工具的出现&#xff0c;育苗系统初见雏形。 现代温室育苗技术的应用&#xff0c;给育苗提供了相对更…

为Raspberry Pi OS(Bookworm)设置固定IP

新版的RPI OS采用NetworkManager管理网络&#xff0c;之前/etc/dhcpcd.conf默认找不见了。不过&#xff0c;我们可以使用命令行进行。以我的WIFI为例&#xff0c;演示下如何设置固定IP。 第一步&#xff0c;找到WIFI的内部名称&#xff1a; sudo nmcli -p connection show 注…

爬虫工具Curl!

爬虫工具Curl&#xff01; 链接: Curl 使用它可以将网站内的信息转成python可用格式 打开开发工具中的网络选项卡右键单击&#xff08;或按住 Ctrl 键单击&#xff09;请求单击“复制”→ “复制为 cURL”粘贴到上面的curl命令框中 !!!警告&#xff1a;复制的命令可能包含 co…

DevOps系列文章 : 使用dpkg命令打deb包

创建一个打包的目录&#xff0c;类似rpmbuild&#xff0c;这里创建了目录deb_build mkdir deb_build目标 我有一个hello的二进制文件hello和源码hello.c, 准备安装到/opt/helloworld目录中 步骤 在deb_build目录创建一个文件夹用于存放我的安装文件 mkdir helloworld在he…

使用Pycharm一键将.ui文件生成.py文件配置教程、一键打开QTDesigner教程

2df3621a-7ffd-4f18-9735-b86464b83a5b 前言 我痛恨所有将白嫖归为理所应当的猪&#x1f416;。 教程 打开pycharm之后&#xff0c;依次点击File->Settings->Tools->External Tools&#xff0c;进入如下界面&#xff1a; 1、配置快捷打开Qt Designer 点击号&…

RouterSrv-DHCP

2023年全国网络系统管理赛项真题 模块B-Windows解析 题目 安装和配置DHCP relay服务,为办公区域网络提供地址上网。DHCP服务器位于AppSrv服务器上。拆分DHCP服务器上的作用域,拆分的百分比为7:3。InsideCli优先从RouterSrv获取地址。配置步骤 安装和配置DHCP relay服务,为办…

Python---TCP 网络应用程序开发流程

1. TCP 网络应用程序开发流程的介绍 TCP 网络应用程序开发分为: TCP 客户端程序开发TCP 服务端程序开发 说明: 客户端程序是指运行在用户设备上的程序 服务端程序是指运行在服务器设备上的程序&#xff0c;专门为客户端提供数据服务。 2. TCP 客户端程序开发流程的介绍 步…

【深度学习】注意力机制(七)Agent Attention

本文介绍Agent Attention注意力机制&#xff0c;Transformer中的Attention模块可以提取全局语义信息&#xff0c;但是计算量太大&#xff0c;Agent Attention是一种计算非常有效的Attention模块。 论文&#xff1a;Agent Attention: On the Integration of Softmax and Linear…

虚拟机的下载、安装

下载 vmware workstation&#xff08;收费的虚拟机&#xff09; 下载vbox 网址&#xff1a;Oracle VM VirtualBox&#xff08;免费的虚拟机&#xff09; 以下选择一个下载即可&#xff0c;建议下载vbox&#xff0c;因为是免费的。安装的时候默认下一步即可&#xff08;路径最好…

第二周:AI产品经理全局学习

一、AI产品架构全景 二、 AI产品岗位分析和了解 三、 AI产品能力模型 四、AI产品经理工作流 五、AI产品经理学习路径和规划 六、本周市场动态

DC-磁盘管理

2023年全国网络系统管理赛项真题 模块B-Windows解析 题目 在DC2上安装及配置软RAID 5。在安装好的DC2虚拟机中添加三块10G虚拟磁盘。组成RAID 5,磁盘分区命名为卷标H盘:Raid5。手动测试破坏一块磁盘,做RAID磁盘修复,确认RAID 5配置完毕。配置步骤 关闭虚拟机,添加3块10G磁…

Easyexcel读取单/多sheet页

Easyexcel读取单/多sheet页 此文档会说明单个和多个的sheet页的读取方法&#xff0c;包括本人在使用过程中的踩坑点。 依赖不会的自行百度导入&#xff0c;话不多说&#xff0c;直接上干货。以下示例基于2.x&#xff0c;新版本基本类似 1、创建实体 实体是用来接收对应列的数据…

计算机找不到vcruntime140_1.dll文件的解决方法,完美解决

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是找不到vcruntime140_1.dll。这些动态链接库文件是程序运行所必需的&#xff0c;一旦缺失&#xff0c;就会导致程序无法正常运行。但是不用担心&#xff0c;下面我将为大家介绍5个解决方法&am…

【STM32】I2C通信

基本的任务是&#xff1a;通过通信线&#xff0c;实现单片机读写外挂模块寄存器的功能。其中至少要实现在指定位置写寄存器和在指定的位置读寄存器这两个功能。 1 I2C通信 I2C&#xff08;Inter IC Bus&#xff09;是由Philips公司开发的一种通用数据总线 两根通信线&#x…