国庆作业 day 10.1

news2024/11/24 12:01:13

 使用select完成TCP并发服务器

#include "myhead.h"
#define ERR_MSG(msg) do{\
	printf("%d\n",__LINE__);\
	perror(msg);\
}while(0)
#define PORT 3696
#define IP "192.1168.10.22"
int main(int argc, const char *argv[])
{		
	//套接字
	int sfd=socket(AF_INET,SOCK_STREAM,0);
	if(sfd==-1)
	{
		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);
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
	{
		ERR_MSG("bind");
		return -1;
	}
	//设置监听状态
	if(listen(sfd,128)==-1)
	{
		ERR_MSG("listen");
		return -1;
	}
	fd_set readfds,tempfds;
	//清空
	FD_ZERO(&readfds);
	//文件描述符
	FD_SET(0,&readfds);
	FD_SET(sfd,&readfds);
	struct sockaddr_in cin;
	socklen_t addrlen=sizeof(cin);
	int newfd=-1;
	char buf[32];
	ssize_t res=0;
	int s_res=-1;
	int maxfd=sfd;
	int sndfd=-1;
	struct sockaddr_in save[1024];
	while(1)
	{
		tempfds =readfds;
		maxfd=maxfd>newfd?maxfd:newfd;
		s_res=select(maxfd+1,&tempfds,NULL,NULL,NULL);
		if(s_res == -1){
			ERR_MSG("select");
			return -1;
		}else if(s_res == 0){
			printf("time out\n");
			break;
	}
	for(int i = 0;i <= maxfd;i++){
			if(FD_ISSET(i,&tempfds) == 0)
				continue;
			if(0 == i){
				printf("触发键盘输入事件\n");
				bzero(buf,sizeof(buf));
				int ret = scanf("%d %s",&sndfd,buf);
				if(ret != 2){
					printf("您的输入格式有误:sndfd buf\n");
					return -1;
				}
				if(sndfd <= 2 || FD_ISSET(sndfd,&readfds) == 0){
					printf("您输入的文件描述符不合法 snfd = %d\n",sndfd);
					return -1;
				}
				//发送
				if(send(sndfd,buf,sizeof(buf),0) == -1){
					ERR_MSG("send");
					return -1;
				}
				printf("send success!\n");
 
			}else if(sfd == i){
				printf("触发客户端连接事件\n");
				//获取一个已经完成的客户端信息,生成一个新的文件描述符 accept
				newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen); 
				if(newfd == -1){
					ERR_MSG("accept");
					return -1;
				}
				printf("[%s:%d]客户端链接成功! newfd = %d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);
				save[newfd] = cin;
				FD_SET(newfd,&readfds);
 
			}else{
				printf("触发接收客户端数据事件\n");
				//接收
				bzero(buf,sizeof(buf));
				res = recv(i,buf,sizeof(buf),0);
				if(res == -1){
					ERR_MSG("recv");
					return -1;
				}else if(res == 0){
					printf("[%s:%d]客户端已下线! newfd = %d\n",inet_ntoa(save[i].sin_addr),ntohs(save[i].sin_port),i);
					close(i);
					FD_CLR(i,&readfds);
					while(FD_ISSET(maxfd,&readfds) == 0 && maxfd-->=0);
					continue;
				}
				printf("[%s:%d] newfd = %d buf = %s \n",inet_ntoa(save[i].sin_addr),ntohs(save[i].sin_port),i,buf);
 
				//发送
				if(send(i,buf,sizeof(buf),0) == -1){
					ERR_MSG("send");
					return -1;
				}
				printf("send success!\n");
			}
		}
	}
	//关闭文件描述符
	if(close(sfd)<0){
		ERR_MSG("close");
		return -1;
	}
	if(close(newfd) < 0){
		ERR_MSG("close");
		return -1;
	}
	
	return 0;
}

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

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

相关文章

使用 sonarqube 进行代码质量检查

Docker 环境准备 参考官方文档先对 Docker Server 进行参数调整 Because SonarQube uses an embedded Elasticsearch, make sure that your Docker host configuration complies with the Elasticsearch production mode requirements and File Descriptors configuration. # …

Wing FTP Server安装配置结合内网穿透实现公网访问本地站点

Wing FTP Server安装配置结合内网穿透实现公网访问本地站点 文章目录 Wing FTP Server安装配置结合内网穿透实现公网访问本地站点前言1.Wing FTP Server下载安装2.Wing FTP Server配置部署3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3…

【kubernetes】kubernetes中的Deployment使用

1 Why need Deployment? K8S中Pod是用户管理工作负载的基本单位&#xff0c;Pod通常通过Service进行暴露&#xff0c;因此&#xff0c;通常需要管理一组Pod&#xff0c;RC和RS主要就实现了一组Pod的管理工作&#xff0c;其中&#xff0c;RC和RS的区别在于&#xff0c;RS提供更…

C++ - 开散列的拉链法(哈希桶) 介绍 和 实现

前言 之前我们介绍了&#xff0c;闭散列 的 开放地址法实现的 哈希表&#xff1a;C - 开放地址法的哈希介绍 - 哈希表的仿函数例子_chihiro1122的博客-CSDN博客 但是 闭散列 的 开放地址法 虽然是哈希表实现的一种&#xff0c;但是这种方式实现的哈希表&#xff0c;有一个很大的…

使用sqlmap获取数据步骤

文章目录 1.使用sqlmap获取所有数据库2.使用sqlmap获取当前连接数据库3.使用sqlmap获取当前数据库下所有表名4.使用sqlmap获取当前数据库下某个表下所有列名5.使用sqlmap获取当前数据库下某个表下指定字段的数据6.测试当前用户是否是管理员7.使用burpsqlmap批量检测8.脱库命令9…

【接口技术】总线课堂习题

1&#xff1a;CPU在执行OUT DX, AL指令时&#xff0c;&#xff08;&#xff09;寄存器的内容送到地址总线上 A&#xff0c;DL B&#xff0c;DX C&#xff0c;AX D&#xff0c;DL 解答&#xff1a;B out指令是把AL的数据输出到DX的端口&#xff0c;因此AL寄存器的内容送到…

多线程学习笔记(一)

文章目录 1 线程基础知识复习2 CompletableFuture1、Future和Callable接口2、FutureTask3、对Future的改进4、案例精讲——电商5、常用方法6、CompetableFutureWithThreadPool【重要】 3 锁1、乐观锁和悲观锁2、synchronized 8锁案例3、公平锁和非公平锁4、可重入锁5、死锁及排…

正点原子嵌入式linux驱动开发——TF-A初探

上一篇笔记中&#xff0c;正点原子的文档简单讲解了一下什么是TF-A&#xff0c;并且也学习了如何编译TF-A。但是TF-A是如何运行的&#xff0c;它的一个运行流程并未涉及。TF-A的详细运行过程是很复杂的&#xff0c;涉及到很多ARM处理器底层知识&#xff0c;所以这一篇笔记的内容…

剖析华为云Astro Platform技术价值与使用体验

面对企业IT专业人员紧缺的挑战&#xff0c;华为云Astro低代码平台提供创新解决方案。让非编程专业人士能快速构建、部署应用&#xff0c;缓解开发资源压力&#xff0c;并高度整合技术架构&#xff0c;强化项目沟通协作。使每个参与其中的角色都找到自己的位置&#xff0c;携手全…

初级篇—第三章多表查询

文章目录 为什么需要多表查询一个案例引发的多表连接初代查询笛卡尔积&#xff08;或交叉连接&#xff09;的理解 多表查询分类等值连接 vs 非等值连接自连接 vs 非自连接内连接VS外连接 SQL99语法实现多表查询内连接的实现外连接的实现左外连接右外连接满外连接 UNION的使用7种…

leetCode 455.分发饼干 贪心算法

455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&…

全网最全Python系列教程(非常详细)---集合讲解(学Python入门必收藏)

&#x1f9e1;&#x1f9e1;&#x1f9e1;这篇是关于Python中集合的讲解&#xff0c;涉及到以下内容&#xff0c;欢迎点赞和收藏&#xff0c;你点赞和收藏是我更新的动力&#x1f9e1;&#x1f9e1;&#x1f9e1; 1、集合是什么&#xff1f; 2、集合应该怎么去定义&#xff1f…

从零手搓一个【消息队列】实现数据的硬盘管理和内存管理(线程安全)

文章目录 一、硬盘管理1, 创建 DiskDataCenter 类2, init() 初始化3, 封装交换机4, 封装队列5, 关于绑定6, 关于消息 二、内存管理1, 数据结构的设计2, 创建 MemoryDataCenter 类3, 关于交换机4, 关于队列5, 关于绑定6, 关于消息7, 恢复数据 三、小结 创建 Spring Boot 项目, S…

Xcode 超简单实用小秘技让撸码进入新境界

概览 Xcode 是开发  应用不可或缺的王牌主力军&#xff0c;虽然 Xcode 中一些常用使用姿势想必大家都已驾轻就熟&#xff0c;但其中仍有一些隐藏宝藏小技巧不为人知。 充分挖掘它们可以极大加速和方便秃头码农们日常的撸码行为。 一般的&#xff0c;它们分为两类&#xff…

机器人制作开源方案 | 四轴飞行器

1. 概述 基于探索者搭建的模块化四轴飞行器研究平台&#xff0c;采用独特的设计方式&#xff0c;可实现在室内完成对四轴飞行器、无人机等运动控制的原理研究&#xff0c;以及学习飞行控制的原理知识。 2. 组装 请按照下图进行机架的组装。 整体图 请解压文末资料中的 /软件/Mi…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(一)

思维导图 学习目标 变量声明 一、Web API 基本认知 作用和分类 什么是DOM DOM树 DOM对象 二、获取DOM对象 三、操作元素内容 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compa…

基于Java的实验室预约管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

【数据结构】选择排序 堆排序(二)

目录 一&#xff0c;选择排序 1&#xff0c;基本思想 2&#xff0c; 基本思路 3&#xff0c;思路实现 二&#xff0c;堆排序 1&#xff0c;直接选择排序的特性总结&#xff1a; 2&#xff0c;思路实现 3&#xff0c;源代码 最后祝大家国庆快乐&#xff01; 一&#xf…

设计模式8、装饰者模式 Decorator

解释说明&#xff1a;动态地给一个对象增加一些额外的职责。就扩展功能而言&#xff0c;装饰模式提供了一种比使用子类更加灵活的替代方案 抽象构件&#xff08;Component&#xff09;&#xff1a;定义一个抽象接口以规范准备收附加责任的对象 具体构件&#xff08;ConcreteCom…

10OpenMP

OpenMP概述 通过线程实现并行化&#xff0c;与Pthread一样&#xff0c;是基于线程的共享内存库 与Pthread的不同 简而言之&#xff1a; Pthread更加底层&#xff0c;需要用户自己定义每一个线程的行为&#xff0c;OpenMP虽然更加简单&#xff0c;但是底层的线程交互实现很难 …