网络编程day5

news2024/9/24 19:13:26

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

//client
#include<myhead.h>
#define CLINET_IP "192.168.125.79"
#define CLINET_PORT 9999
#define SERVE_IP "192.168.125.79"
#define SERVE_PORT 8888
int main(int argc, const char *argv[])
{
	//socket()
	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;
	}
	//(bind())
	struct sockaddr_in cin;
	cin.sin_family=AF_INET;
	cin.sin_port=htons(CLINET_PORT);
	cin.sin_addr.s_addr=inet_addr(CLINET_IP);
	if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)
	{
		perror("bind error");
		return -1;
	}
	printf("[%s:%d]->绑定成功\n",CLINET_IP,CLINET_PORT);
	//connect()
	struct sockaddr_in 	sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(SERVE_PORT);
	sin.sin_addr.s_addr=inet_addr(SERVE_IP);
	if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
	{
		perror("connect error");
		return -1;
	}
	printf("[%s:%d]->连接成功\n",SERVE_IP,SERVE_PORT);
	//recv()/send()
	char buf[128]="";
	fd_set readfds;//定义文件描述符集合
	FD_ZERO(&readfds);//清空集合
	FD_SET(0,&readfds);//放入集合
	FD_SET(cfd,&readfds);//放入集合
	int res1=-1;//接收select返回
	int res2=-1;//接收recv返回
	fd_set tempfds;//定义一个临时文件描述符集合
	while(1)	
	{
		tempfds=readfds;
		res1=select(cfd+1,&tempfds,NULL,NULL,NULL);
		if(res1==-1)
		{
			perror("select error");
			return -1;
		}
		else if(res1==0)
		{
			printf("time out\n");
			return -1;
		}
	
		if(FD_ISSET(0,&tempfds))
		{
			bzero(buf,sizeof(buf));
			fgets(buf,sizeof(buf),stdin);
			buf[strlen(buf)-1]=0;
			send(cfd,buf,sizeof(buf),0);
		}
		if(FD_ISSET(cfd,&tempfds))
		{
			bzero(buf,sizeof(buf));
			 res2=recv(cfd,buf,sizeof(buf),0);
			if(res2==0||strcmp(buf,"quit")==0)
			{
				printf("服务器下线\n");
				break;
			}
			printf("[%s:%d]->%s\n",SERVE_IP,SERVE_PORT,buf);
		}
	}
	//close()
	close(cfd);
	return 0;
}
//serve
#include<myhead.h>
#define PORT 8888
#define IP "192.168.125.79"
int main(int argc, const char *argv[])
{
	int sfd=-1;
	if((sfd=socket(AF_INET,SOCK_STREAM,0))==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("sfd=%d\n",sfd);
	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;
	}
	printf("bind success _%d_%s_%s\n",__LINE__,__FILE__,__func__);
	if(listen(sfd,128)==-1)
	{
		perror("listen error");
		return -1;
	}
	printf("listen success _%d_%s_%s\n",__LINE__,__FILE__,__func__);
	struct sockaddr_in cin;
	socklen_t socklen=sizeof(cin);
	fd_set readfds;	//定义阻塞的文件描述符集合
	FD_ZERO(&readfds);	//清空
	FD_SET(sfd,&readfds);	//将文件描述符放入
	FD_SET(0,&readfds);
	int res=0;//select返回值
	int maxfd=sfd;
	int newfd=-1;
	char buf[128]="";
	char rbuf[128]="";//服务器客户端通信
	struct sockaddr_in arr_cin[1024];
	fd_set tempfds;
	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;
		}
		else
		{	
			for(int index=0;index<=maxfd;index++)
			{
				if(!FD_ISSET(index,&tempfds))//所有文件描述符没有事件发生	
				{
					continue;
				}
				else if( index==sfd )
				{
					if((newfd=accept(sfd,(struct sockaddr*)&cin,&socklen))==-1)
					{
						perror("accept error");
						return -1;
					}
					arr_cin[newfd]=cin;
					printf("[%s:%d]:连接成功,newfd=%d\n",inet_ntoa(arr_cin[index].sin_addr),ntohs(arr_cin[index].sin_port),newfd);
					FD_SET(newfd,&readfds);//新的newfd应当加入原本的readfds
					if(newfd>maxfd)
					{
						maxfd=newfd;
					}
				}
				else if( index==0 )
				{
					scanf("%s",buf);
					printf("将发送所有连接的用户->%s\n",buf);
					for(int j=4;j<=maxfd;j++)
					{
					send(j,buf,sizeof(buf),0);
					}
				}
				else
				{
					bzero(rbuf,sizeof(rbuf));
					if(recv(index,rbuf,sizeof(rbuf),0)==0)
					{
						printf("客户端下线\n");
						close(index);//关闭套接字文件
						FD_CLR(index,&tempfds);//移除select数组
						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并发服务器

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

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

相关文章

音视频直播核心技术介绍

直播流程 采集&#xff1a; 是视频直播开始的第一个环节&#xff0c;用户可以通过不同的终端采集视频&#xff0c;比如 iOS、Android、Mac、Windows 等。 前处理&#xff1a;主要就是美颜美型技术&#xff0c;以及还有加水印、模糊、去噪、滤镜等图像处理技术等等。 编码&#…

文件消失但是有占用内存的恢复方法

文件消失但占用内存是一个常见的问题&#xff0c;通常是由于文件系统错误或病毒攻击引起的。在这种情况下&#xff0c;文件虽然从目录结构中消失&#xff0c;但它们仍然占用存储空间。本文将分析这一问题的原因&#xff0c;并探讨解决该问题的几种方法。 文件消失但占用内存的原…

Text2SQL学习整理(四)将预训练语言模型引入WikiSQL任务

导语 上篇博客&#xff1a;Text2SQL学习整理&#xff08;三&#xff09;&#xff1a;SQLNet与TypeSQL模型简要介绍了WikiSQL数据集提出后两个早期的baseline&#xff0c;那时候像BERT之类的预训练语言模型还未在各种NLP任务中广泛应用&#xff0c;因而作者基本都是使用Bi-LSTM…

头部首发优志愿头部u_sign生成与TLS指纹处理! + 数据可视化技术讲解【Python爬虫】

目录 针对大学名称 大学排名, 综合指数,学校情况等数据进行爬取 找对应得数据包 请求发现数据有加密 发现加密参数 搜索加密参数&#xff0c;好进行分析 分析过程 数据可视化 针对大学名称 大学排名, 综合指数,学校情况等数据进行爬取 首先进行鼠标右键&#xff0c;进行…

制作PPT找了一个校徽是方形的,如何裁剪为圆形的。

问题描述&#xff1a;制作PPT找了一个校徽是方形的&#xff0c;如何裁剪为圆形的。 问题解决&#xff1a;使用一个在线圆形裁剪软件即可。 网址为&#xff1a; https://crop-circle.imageonline.co/cn/#google_vignette

计算机组成原理综合2

21、和外存储器相比&#xff0c;内存储器的特点是________。C A. 容量大、速度快、成本低 B. 容量大、速度慢、成本高 C. 容量小、速度快、成本高 D. 容量小、速度快、成本低 22、某计算机字长16位&#xff0c;存储器容量64KB&#xff0c;若按字编址&#xf…

网络基础(十二):ACL与NAT

目录 一、ACL 1、ACL的概述 2、ACL的分类 3、ACL的应用 4、ACL的组成和基本原理 ​编辑 5、ACL的配置 5.1配置基本ACL 5.2配置高级ACL 二、NAT 1、NAT的概述 2、NAT的分类 3、NAT的工作原理 4、静态NAT的配置 5、动态NAT的配置 6、NAPT&#xff08;端口映射&am…

01AVue入门(持续学习中)

1.使用AVue开发简单的前端页面直接简单到起飞,他是Element PlusVueVite开发的,不需要向元素的前端代码一样一个组件要传很多参数,他可以使用Json文本来控制我们要传入的数据结构来决定显示什么 //我使用的比较新,我们也可以使用cdn直接使用script标签直接引入 2.开发中遇到的坑…

期货平仓日历(期货平仓日期汇总)

什么是期货平仓日历&#xff1f; 期货是一种高风险高收益的投资品种。而期货交易不同于股票等其他投资品种的交易&#xff0c;期货交易需要在一定时间内才能买卖。而期货平仓日历就是指期货交易中规定的所有合约的平仓日期汇总。 常见期货平仓日期和时间&#xff1f; 不同的…

KylinV10 安装 MySQL 教程(可防踩雷)

KylinV10 安装 MySQL 教程&#xff08;可防踩雷&#xff09; 1、直接用 apt 快捷安装 MySQL $ sudo apt-get update #更新软件源 $ sudo apt-get install mysql-server #安装mysql然后你会发现&#xff0c;KylinV10 安装畅通无阻&#xff0c;并没有设置密码的场景&#xff0c…

Vue: node-sass 无法为当前环境找到绑定, Windows64-bit, 重新安装node-sass失败

参照两位大神的文章总结: 参考1: 解决Node Sass could not find a binding for your current environment: Windows 64-bit with Node.js 14.x-CSDN博客 参考2: 前端开发环境搭建踩坑笔记——npm install node-sass安装失败的解决方案-CSDN博客 总结: 管理员运行 先卸载n…

测试自动化平台 | 测试开发工程师的进阶之路

一、测试工程师的现状 很多测试小伙伴在工作中有时会比较迷茫&#xff0c;不知该怎样突破瓶颈&#xff0c;更好的发展。 那么测试人员究竟该如何打破瓶颈继续向上提升呢&#xff1f;如果你苦于不知所措&#xff0c;又满怀斗志向上的话&#xff0c;不妨一起聊聊。测试职业发展…

Compose 组合项 - 滑动列表 LazyColumn、LazyRow

一、概念 可滚动&#xff0c;类似RecyclerView&#xff08; Column、Row 用 Modifier 设置滚动是相当于ScrollView&#xff09;。 从 Navigation 返回后丢失状态&#xff08;跳到头部&#xff09; &#xff1a;将 LazyListState 提升到 Screen 级别&#xff0c;不用放到 ViewMo…

【Axure RP9】实现登入效验及实现左侧菜单栏跳转各页面

目录 一 效验简介 1.1 校验好处 1.2 应用场景 二 登入校验 2.1 效果 2.2 实现流程 三 左边菜单栏左侧菜单栏跳转各页面 3.1 效果 3.2 实现图 一 效验简介 1.1 校验好处 提高安全性&#xff1a; 在传统的用户名和密码登录的基础上&#xff0c;引入了另一种或多种验证…

MyBatis-Plus是什么?能干嘛?

MyBatis-Plus是一个基于MyBatis的增强工具&#xff0c;旨在简化开发、提高效率。它提供了通用的mapper和service&#xff0c;可以在不编写任何SQL语句的情况下&#xff0c;快速实现对单表的CRUD、批量、逻辑删除、分页等操作。 MyBatis-Plus的主要特性包括&#xff1a; 无侵入…

【PostgreSQL内核学习(十八)—— 存储管理(存储管理的体系结构)】

存储管理 概述存储管理器的体系结构存储管理器的主要任务读写元组过程 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在适用的情况下注明引用来源。 本文主要参考…

最新鸿蒙HarmonyOS 使用Progress、Toggle开发一个接单界面

Progress 进度条组件&#xff0c;用于显示内容加载或操作处理等进度。 接口 Progress(options: {value: number, total?: number, type?: ProgressType}) Toggle组件提供勾选框样式、状态按钮样式及开关样式。 接口 Toggle(options: { type: ToggleType, isOn?: boolean …

SpringBoot actuator应用监控

文章目录 引入依赖端点(Endpoints)端点种类端点开启配置暴露端点手动暴露端点 端点保护引入spring security依赖配置security 端点响应缓存访问端点路径修改CORS跨域支持健康信息(/actuator/health)自定义healthInfo 应用信息(/actuator/info) 监控信息可视化引入依赖配置查看配…

【LeetCode刷题】--245.最短单词距离III

245.最短单词距离III class Solution {public int shortestWordDistance(String[] wordsDict, String word1, String word2) {int len wordsDict.length;int ans len;if(word1.equals(word2)){int prev -1;for(int i 0;i<len;i){String word wordsDict[i];if(word.equa…

Unity中Shader测试常用的UGUI功能简介

文章目录 前言一、锚点1、锚点快捷修改位置2、使用Anchor Presets快捷修改3、Anchor Presets界面按下 Shift 可以快捷修改锚点和中心点位置4、Anchor Presets界面按下 Alt 可以快捷修改锚点位置、UI对象位置 和 长宽大小 二、Canvas画布1、UGUI中 Transform 变成了 Rect Transf…