国庆10.01

news2024/12/22 4:28:50

TCPselect

代码

服务器

#include<myhead.h>
#include<sqlite3.h>
#define PORT 6666 			//端口号
#define IP "192.168.0.104" 	//IP地址

//键盘事件
int jp(fd_set tempfds,int maxfd)
{
	char buf[128] = ""; //用来接收数据
	char buf1[128] = ""; //用来接收数据
	int snfd = -1; 		//用来接受从终端的文件描述符
	bzero(buf,sizeof(buf)); //清空字符串
	int res = scanf("%d %s",&snfd,buf); //从终端读取文件描述符和接收数据
	while(getchar() != 10); //循环吸收垃圾字符
	if(res != 2) //判断是否输入了两个数据
	{
		printf("输入数据格式错误!\n");
		return -1;
	}
	if(snfd <= 2 || FD_ISSET(snfd,&tempfds) == 0) //判断是否正确输入文件描述符
	{
		printf("输入非法文件描述符:%d\n",snfd);
		return -1;
	}
	sprintf(buf1,"%c%c%s",'s',':',buf);
	if(send(snfd,buf1,sizeof(buf1),0) < 0) 		//判断是否发送成功
	{
		ERR_MSG("send");
		return -1;
	}
	return 0;
}

//客户端链接事件
int lj(int sfd,struct sockaddr_in sevecin[1024],fd_set *preadfds,int *maxfd)
{
	int newfd = -1;
	struct sockaddr_in cin; //客户端信息结构体
	socklen_t len = sizeof(cin); //信息结构体真实大小

	//连接客户端
	newfd = accept(sfd,(struct sockaddr *)&cin,&len);
	if(newfd < 0) //判断是否连接成功
	{
		ERR_MSG("newfd");
		return -1;
	}
	printf("[%s : %d] 客户端连接成功!\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
	sevecin[newfd] = cin; //将新的客户端连接到客户端数组中
	FD_SET(newfd,preadfds);//将新的文件描述符添加到读集合中
	*maxfd = *maxfd > newfd ? *maxfd : newfd;//更新最大文件描述符
	return 0;
}

//客户端交互事件
int jh(int fd, struct sockaddr_in sevecin[1024],fd_set *readfds,int *maxfd)
{
	char buf[128] = ""; //搬运工
	bzero(buf,sizeof(buf)); //清空字符串

	//接收
	ssize_t res = recv(fd,buf,sizeof(buf),0);
	if(res < 0)
	{
		ERR_MSG("recv");
		return -1;
	}
	else if(res == 0)
	{
		printf("[%s : %d]客户端已下线!\n",inet_ntoa(sevecin[fd].sin_addr),ntohs(sevecin[fd].sin_port));
		close(fd); //关闭文件描述符
		FD_CLR(fd,readfds);//从读集合中删除该信息
		while(FD_ISSET(*maxfd,readfds) && (*maxfd)-- >= 0);//更新最大文件描述符
		return 0;
	}
	printf("[%s : %d]: %s\n",inet_ntoa(sevecin[fd].sin_addr),\
			ntohs(sevecin[fd].sin_port),buf);

	//发送
	strcat(buf,"*_*");
	if(send(fd,buf,sizeof(buf),0) < 0)
	{
		ERR_MSG("send");
		return -1;
	}
	return 0;
}

//主函数
int main(int argc, const char *argv[])
{
	//创建套接字
	int sfd = -1;
	if((sfd = socket(AF_INET,SOCK_STREAM,0)) < 0)//判断是否创建成功
	{
		ERR_MSG("socket");
		return -1;
	}

	//端口快速复用
	int reuse = 1;
	if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0)
	{
		ERR_MSG("setsockopt");
		return -1;
	}

	//填充信息结构体
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT); 			//端口号
	sin.sin_addr.s_addr = inet_addr(IP); 	//IP

	//绑定
	if(bind(sfd, (struct sockaddr *)&sin,sizeof(sin)) < 0)//判断是否绑定成功
	{
		ERR_MSG("bind");
		return -1;
	}

	//监听
	if(listen(sfd,128) < 0)//判断是否设置监听成功
	{
		ERR_MSG("listen");
		return -1;
	}

	//创建一个读集合
	fd_set readfds,tempfds;

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

	//将需要监测的文件放入到集合中
	FD_SET(0,&readfds);
	FD_SET(sfd,&readfds);

	//记录最大文件描述符
	int maxfd = sfd;

	//记录select函数的返回值
	int s_res;

	//备份连接成功的客户端信息
	struct sockaddr_in sevecin[1024];
	bzero(sevecin,sizeof(sevecin)); //清空数组
	while(1)
	{
		FD_ZERO(&tempfds);
		tempfds = readfds;
		s_res = select(maxfd+1,&tempfds,NULL,NULL,NULL); //多路复用
		if(s_res < 0)
		{
			ERR_MSG("select");
			return -1;
		}
		if(s_res == 0)
		{
			printf("超时!\n");
			break;
		}
		for(int i = 0; i <= maxfd; i++)
		{
			if(FD_ISSET(i,&tempfds) == 0)
			{
				continue;
			}
			if(i == 0)
			{
				//键盘事件
				jp(readfds,maxfd);
			}
			else if(i == sfd)
			{
				//客户端链接事件
				lj(sfd,sevecin,&readfds,&maxfd);
			}
			else
			{
				//客户端交互事件
				jh(i,sevecin,&readfds,&maxfd);
			}
		}
	}
	if(close(sfd) < 0)
	{
		ERR_MSG("close");
		return -1;
	}
	return 0;
}

客户端

#include<myhead.h>
#include<sqlite3.h>
#define PORT 6666    		//端口号
#define IP "192.168.0.104" 	//IP
int main(int argc, const char *argv[])
{
	//创建流式套接字
	int cfd = socket(AF_INET,SOCK_STREAM,0);
	if(cfd < 0) //判断是否创建成功
	{
		ERR_MSG("socket");
	}

	//填充客户端地址信息
	struct sockaddr_in cin;
	cin.sin_family = AF_INET;
	cin.sin_port = htons(PORT); //端口
	cin.sin_addr.s_addr = inet_addr(IP); //IP

	//连接
	if(connect(cfd,(struct sockaddr *)&cin,sizeof(cin)) < 0)
	{
		ERR_MSG("connect");
		return -1;
	}

	//定义读集合
	fd_set readfds,tempfds;

	FD_ZERO(&readfds); //清空集合
	FD_SET(0,&readfds); //加入集合
	FD_SET(cfd,&readfds);

	char buf[128] = ""; //定义搬运工
	while(1)
	{
		tempfds = readfds;
		bzero(buf,sizeof(buf));
		//多路复用
		int s_res = select(cfd+1,&tempfds,NULL,NULL,NULL);
		if(s_res < 0)
		{
			ERR_MSG("select");
			return -1;
		}
		if(s_res == 0)
		{
			printf("超时!\n");
			break;
		}

		//向服务器发送数据
		if(FD_ISSET(0,&tempfds))
		{
			bzero(buf,sizeof(buf));//清空字符串
			fgets(buf,sizeof(buf),stdin); //从终端获取数据
			buf[strlen(buf) - 1] = 0; //换行变成'\0'
			if(send(cfd,buf,sizeof(buf),0) < 0) //发送数据并判断数据是否发送成功
			{
				ERR_MSG("send");
				return -1;
			}
		}

		//从服务器接受数据
		if(FD_ISSET(cfd,&tempfds))
		{
			bzero(buf,sizeof(buf)); //清空字符串
			int res = recv(cfd,buf,sizeof(buf),0); 
			if(res < 0) 	//判断是否成功接受
			{
				ERR_MSG("recv");
				return -1;
			}
			else if(res == 0)  //判断服务器是否下线
			{
				printf("服务器下线!\n");
				break;
			}
			printf("%s\n",buf);
			fflush(stdout);
		}
	}
	if(close(cfd)) //关闭文件描述符并判断是否关闭成功
	{
		ERR_MSG("close");
		return -1;
	}
	return 0;
}

现象

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

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

相关文章

RHEL8.0安装+基础命令练习+discuz(lamp)论坛搭建

上课练习环境&#xff1a; RHEL8.0系统镜像下载&#xff1a; 链接1&#xff1a;https://pan.baidu.com/s/1wX2j-aTO1VRcHQYpCDYnEg 提取码&#xff1a;6buv 链接2&#xff1a;https://ws28.cn/f/32i4oq8p5r1 &#xff08;下载完2个文件后只需要解压001&#xff0c;推荐压缩…

树莓派4B串口通信配置方式

目录 1树莓派4B的安装&#xff1a; 1.1安装Serial与使用 1.1.1安装serial 1.1.2打开串口 1.2设置硬件串口为GPIO串口&#xff08;修改串口映射关系&#xff09; 1.2.1修改配置文件 2.1minicom串口 2.1.1安装minicom 这篇博客源于&#xff1a;工创赛。需要让树莓派与STM…

Java集合处理Stream流使用解析

Stream Stream是Java 8引入的一个新的API&#xff0c;用于处理集合数据的流式操作。它提供了一种更简洁、更灵活的方式来处理集合数据&#xff0c;可以实现更高效的数据处理和转换。 使用Stream&#xff0c;可以通过一系列的操作来对集合数据进行筛选、映射、排序、聚合等操作…

SpringBoot终极讲义第一章笔记

01.Spring Boot简介 1.Spring的本质和作用 spring的本质就是一个"容器",它负责创建并管理容器中的对象(组件,也称为Bean),并管理组件之间的依赖关系(何为依赖关系:A组件需要调用B组件方法,称为A依赖于B) 因此学习Spring最常用的两个注解: Component:将被修饰的类…

使用VSCODE 调试ros2具体设置

vscode 调试 ROS2 张得帅&#xff01; 于 2023-09-09 15:39:39 发布 456 收藏 1 文章标签&#xff1a; vscode ros2 版权 1、在下列目录同层级找到.vscode文件夹 . ├── build ├── install ├── log └── src 2、 安装ros插件 3、创建tasks.json文件&#xff0c;添…

真正理解浏览器渲染更新流程

浏览器渲染更新过程 文章目录 浏览器渲染更新过程帧维度解释帧渲染过程一些名词解释Renderer进程GPU进程rendering(渲染) vs painting(绘制)⭐位图纹理Rasterize(光栅化) 1. 浏览器的某一帧开始&#xff1a;vsync2. Input event handlers3. requestAnimationFrame4. 强制重排(可…

Git/GitHub/Idea的搭配使用

目录 1. Git 下载安装1.1. 下载安装1.2. 配置 GitHub 秘钥 2. Idea 配置 Git3. Idea 配置 GitHub3.1. 获取 GitHub Token3.2. Idea 根据 Token 登录 GitHub3.3. Idea 提交代码到远程仓库3.3.1. 配置本地仓库3.3.2. GitHub 创建远程仓库1. 创建单层目录2. 创建多层目录3. 删除目…

【数据结构】二叉树链式结构补充和二叉树的顺序结构及实现

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;数据结构 &#x1f4a8;吾生也有涯&#xff0c;而知也无涯 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 文章目录 前言&#x1f4da;一、二叉树链…

机器人过程自动化(RPA)入门 8. 异常处理、调试和日志记录

有时,自动化程序可能无法执行。为了处理此类情况,我们使用异常处理活动。在本章中,我们将从UiPath中可用的各种类型的异常处理方法、您可能遇到的异常以及如何处理它们开始。我们还将学习日志记录。本章涉及的一个重要主题是调试,以检查工作流是否正常工作,并更正任何错误…

Neural Networks for Fingerprint Recognition

Neural Computation ( IF 3.278 ) 摘要&#xff1a; 在采集指纹图像数据库后&#xff0c;设计了一种用于指纹识别的神经网络算法。当给出一对指纹图像时&#xff0c;算法输出两个图像来自同一手指的概率估计值。在一个实验中&#xff0c;神经网络使用几百对图像进行训练&…

Python学习之索引与切片

Python学习之索引与切片 s “0abcdefghijklmnopqrstuvwxyz”&#xff0c;第一个元素‘0’&#xff0c;索引号为0&#xff0c;最后一个元素‘z’&#xff0c;索引号为26 1. s[0]获取索引号为0的元素 2. s[1:3]获取索引号为1的元素&#xff0c;直到但不包括索引号为3的元素。即…

大数据-玩转数据-Flink Sql 窗口

一、说明 时间语义&#xff0c;要配合窗口操作才能发挥作用。最主要的用途&#xff0c;当然就是开窗口然后根据时间段做计算了。Table API和SQL中&#xff0c;主要有两种窗口&#xff1a;分组窗口&#xff08;Group Windows&#xff09;和 含Over字句窗口&#xff08;Over Win…

S32K144 GPIO编程

前面的文章介绍了如何在MDK-Keil下面进行S32K144的开发&#xff0c;下面就使用该工程模板进行GPIO LED的编程试验。 1. 开发环境 S32K144EVB-Q100开发板MDK-Keil Jlink 2. 硬件连接 S32K144EVB-Q100开发板关于LED的原理图如下&#xff1a; 也就是具体连接关系如下&#xf…

【知识点随笔分析 | 第五篇】简单介绍什么是QUIC

前言&#xff1a; 随着互联网的快速发展&#xff0c;传统的基于TCP的协议开始显现出一些局限性。TCP在连接建立和拥塞控制方面存在一定的延迟&#xff0c;这可能导致用户在访问网页、观看视频或玩网络游戏时感受到不必要的等待时间。而QUIC作为一种新兴的传输协议&#xff0c;试…

Java编程技巧:swagger2、knif4j

目录 1、springbootswagger2knif4j2、springbootswagger3knif4j3、springcloudswagger2knif4j 1、springbootswagger2knif4j 2、springbootswagger3knif4j 3、springcloudswagger2knif4j 注意点&#xff1a; Api注解&#xff1a;Controller类上的Api注解需要添加tags属性&a…

P1311 [NOIP2011 提高组] 选择客栈(小小的也很可爱【指小动规】)

[NOIP2011 提高组] 选择客栈 题目描述 丽江河边有 n n n 家很有特色的客栈&#xff0c;客栈按照其位置顺序从 1 1 1 到 n n n 编号。每家客栈都按照某一种色调进行装饰&#xff08;总共 k k k 种&#xff0c;用整数 0 ∼ k − 1 0 \sim k-1 0∼k−1 表示&#xff09;&am…

stm32 - 中断

stm32 - 中断 中断向量表NVIC 嵌套中断向量控制器优先级 中断向量表 自定义的中断服务函数&#xff0c;由编译器随机指定函数地址 stm32的中断&#xff0c;由于硬件的限制&#xff0c;只能跳到固定的地址执行程序 为了能让硬件跳转到一个不固定的中断函数中&#xff0c; 需要在…

基于Qt Creator开发的坦克大战小游戏

目录 介绍开发环境技术介绍安装说明项目目录设计思想项目介绍运行演示知识点记录Gitee源码链接 介绍 &#xff01;&#xff01;&#xff01;资源图片是从网上免费下载&#xff0c;源码都是原创&#xff0c;供个人学习使用&#xff0c;非盈利&#xff01;&#xff01;&#xff…

Acwing 836. 合并集合

Acwing 836. 合并集合 题目描述思路讲解代码展示 题目描述 思路讲解 并查集&#xff1a;代码短&#xff0c;思路精巧&#xff0c;面试常见。 近乎O&#xff08;1&#xff09;的时间复杂度。 代码展示 #include<iostream>using namespace std;const int N 100010; in…

Python海洋专题四之水深地图图像修饰

Python海洋专题四之水深地图图像修饰 海洋与大气科学 上期会修改画布大小、坐标轴字体 没有对数据本身进行修改 本期内容 1&#xff1a;修改colormap&#xff01; 2&#xff1a;倒置colormap 3&#xff1a;加上colorbar、调整其显示位置和字体大小 1&#xff1a;修改colo…