poll开发服务器

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

函数说明:与select类似,委托内核监控可读,可写,异常事件。

函数说明:

fds:一个struct pollfd结构体数组的首地址

struct pollfd {
               int   fd;         要监控的文件描述符
               short events;     输入参数,告诉内核要监控的可读,可写,异常事件
               short revents;    输出参数,内核告诉应用程序改变的文件描述符
           };

events/revents:
 POLLIN :可读事件

 POLLOUT:可写事件

 POLLERR:异常事件

nfds:要监控的文件描述符的数量,最大数组下标+1

timeout:

=0:不阻塞,立刻返回

-1:表示一直阻塞,直到事件发生

>0:表示阻塞时长,在时长范围内若有事件发生就会立刻返回

时间到也会返回。 

 开发流程:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include <sys/types.h> 
#include <netinet/in.h>
#include<ctype.h>
#include <poll.h>
#include <signal.h>
#include<errno.h>

int main()
{
	//int socket(int domain, int type, int protocol);
	int lfd=socket(AF_INET,SOCK_STREAM ,0);
	if(lfd<0)
	{
		perror("socket error");
		return -1;
	}
	// int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
	int opt=1;
	setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(int));
	//int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
	struct sockaddr_in sev;
	sev. sin_family=AF_INET;
	sev. sin_port=htons(8888);
	inet_pton(AF_INET,"192.168.230.130",&sev.sin_addr.s_addr);
	int ret=bind(lfd,(struct sockaddr*)&sev,sizeof(sev));
	if(ret<0)
	{
		perror("bind error");
		return -1;
	}
	ret=listen(lfd,128);
	if(ret<0)
	{
		perror("listen error");
		return -1;
	}
	struct pollfd fds[1024];//定义数组
	int i;
	int cfd;
	int nready;
	int maxi = 0;一开始的最大下标
	int x;
	int j;
	int sockfd;
	char buf[64];
	int n;
	for(i=0;i<1024;i++)
	{
		fds[i].fd=-1;//把数组的fd全部初始化为-1,表示该位置空闲
	}

	fds[0].fd=lfd;//在位置零处存放lfd监听文件描述符,让内核监控lfd
	fds[0].events=POLLIN;//监听可读事件
	struct sockaddr_in client;//客户端地址
	socklen_t len;
	len=sizeof(client);
	char sIP[16];
	while(1)
	{
		nready=poll(fds,maxi+1,-1); //maxi表示监控文件描述符的数量
		if(nready < 0)
		{
			if(errno==EINTR)//被信号打断
			{
				continue;
			}
			break;
		}

		if(fds[0].revents==POLLIN)//lfd发生变化,有客户端请求连接
		{
			cfd=accept(lfd,(struct sockaddr*)&client,&len);
			for(i=1;i<1024;i++)//遍历数组元素
			{
				if(fds[i].fd==-1)//值为-1说明位置空闲
				{
					memset(sIP,0x00,sizeof(sIP));
					printf("client:ip==[%s],port==[%d] is connect\n",inet_ntop(AF_INET,&client.sin_addr.s_addr,sIP,sizeof(sIP)),ntohs(client.sin_port));
					fds[i].fd=cfd;//加入数组,让内核监控此cfd
					fds[i].events=POLLIN;//监控可读事件
					break;//退出for循环
				}
			}
			if(i==1024)
			{
				printf("there is no space\n");
				close(cfd);
				continue;
			}
			if(maxi < i)
			{
				maxi = i;//更新最大数组下标
			}
           if(--nready==0)
           {
                continue;//可读事件为0,继续while循环,不用进行下面的操作
           }
		}

		for(x=1;x<=maxi;x++)//从数组开始循环
		{
			sockfd=fds[x].fd;
			if(sockfd==-1)
			{
				continue;//无效,继续循环
			}

			if(fds[x].revents==POLLIN)
			{
				memset(buf,0x00,sizeof(buf));
				n=read(sockfd,buf,sizeof(buf));
				if(n<=0)
				{
					printf("read error or client close, n==[%d]\n",n);
					close(sockfd);//关闭文件描述符
					fds[x].fd=-1;//移除,让内核不监控此文件描述符
				}
				else //n>0的情况
				{
					printf("[%d]n==[%d],buf==[%s]\n",x,n,buf);
					for(j=0;j<n;j++)
					{
						buf[j]=toupper(buf[j]);
					}
					write(sockfd,buf,n);
				}
				if(--nready==0)
				{
					break;
				}
			}
		}
	}

	close(lfd);
	return 0;
}

结果:

 

由结果可见 删除1位置时,重新连接的客户端是从位置1连接的,说明数组位置充分使用 

注意:

1 当poll函数返回时,结构体当中的fd和events没有发生变化,究竟有没有事件发生由revents来判断,所以poll是请求和返回分离。

2 struct pollfd结构体中fd成员赋值为-1,则内核不会对这个文件描述符进行监控

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

上门废品回收小程序开发,互联网回收创业模式,稳占回收市场

随着人们生活水平的提高&#xff0c;我国居民产生了大量的废弃物品&#xff0c;这为废品回收行业提供了巨大的市场空间。 当下&#xff0c;废品回收行业成为了不少年轻人讨论的热门话题&#xff0c;吸引了越来越多的企业商家进行到市场中&#xff0c;成为了一个创业的重要行业…

【附教程】2024,人工智能+AI绘画,看这里就够了~14款主流图像生成软件工具总有一个适合你

AI绘画技术通过深度学习和处理海量图像数据&#xff0c;能够迅速将文字描述转化为富有创意和艺术性的画作。这一技术不仅极大地提升了艺术家的创作效率和作品质量&#xff0c;还为他们提供了全新的灵感来源和创作方式&#xff0c;推动了艺术领域的创新与发展。 同时&#xff0…

项目管理【引论一】项目管理的目标和高层次目标

系列文章目录 【引论一】项目管理的目标和高层次目标 一、项目管理的目标 项目管理的目标是在规定的时间内&#xff0c;在批准的预算内&#xff0c;完成事先确定的工作范围内的工作&#xff0c;并且达到预期的质量性能要求。 1.时间、成本和质量之间的关系 1.1时间、成本和…

(C语言)二分查找 超详细

&#x1f4cc; 博客主页 爆打维c 目录 一、二分查找的原理 1.优点 2.缺陷 3.原理&#xff08;核心思想&#xff09; 4.例题 描述 思路: 一、二分查找的原理 在讲原理之前&#xff0c;先为大家分析一下二分查找的优缺点。 1.优点 如果我们要在数组里面找一个元素的位置…

ElasticSearch 底层读写原理

ElasticSearch 底层读写原理 ​ 写请求是写入 primary shard&#xff0c;然后同步给所有的 replica shard&#xff1b;读请求可以从 primary shard 或 replica shard 读取&#xff0c;采用的是随机轮询算法。 1、ES写入数据的过程 1.选择任意一个DataNode发送请求&#xff0c…

代码随想录刷题day18|找树左下角的值路径总和中序后序构造二叉树

文章目录 day18学习内容一、找树左下角的值1.1、思路1.2、错误写法1.2.1、为什么这么写是错的&#xff1f; 1.3、正确写法 二、路径总和2.1、思路2.2、正确写法12.2.1、这种写法回溯思想体现在哪里&#xff1f; 2.3、正确写法22.3.1、这种写法回溯思想体现在哪里&#xff1f; 2…

第三百九十二回

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容&#xff0c;本章回中将介绍如何通过相机获取图片文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. …

四个领域,企业官网依然无可替代。

2023-10-23 14:17贝格前端工场 企业官网在以下领域无可替代&#xff1a; 专业性强的领域&#xff1a;如金融、法律、医学等&#xff0c;这些领域专业性很强&#xff0c;需要权威、专业的官网来提供详细、准确的信息1。需要展示企业形象、实力的领域&#xff1a;如制造业、房地…

pytorch(九)卷积神经网络

文章目录 卷积神经网络全连接神经网络与卷积神经网络的区别概念性知识mnist数据集(卷积神经网络) GoogLeNetInception 残差网络ResNet残差块结构 卷积神经网络 全连接神经网络与卷积神经网络的区别 全连接神经网络是一种最为基础的前馈神经网络&#xff0c;他的每一个神经元都…

QT----写完的程序打包为APK在自己的手机上运行

目录 1、qt安装android组件2、打开qt配置Android 环境3、手机打开开发者模式&#xff0c;打开usb调试&#xff0c;连接电脑4、运行代码 1、qt安装android组件 qtcreater–工具-QTMaintenaceTool-startMaintenaceTool—登陆—添加或修改组件—找到android&#xff0c;安装 若是…

基于java+springboot+vue实现的学生信息管理系统(文末源码+Lw+ppt)23-54

摘 要 人类现已进入21世纪&#xff0c;科技日新月异&#xff0c;经济、信息等方面都取得了长足的进步&#xff0c;特别是信息网络技术的飞速发展&#xff0c;对政治、经济、军事、文化等方面都产生了很大的影响。 利用计算机网络的便利&#xff0c;开发一套基于java的大学生…

.NET高级面试指南专题十五【 原型模式介绍,Clone要这样去用】

介绍&#xff1a; 原型模式是一种创建型设计模式&#xff0c;其主要目的是通过克隆现有对象来创建新对象&#xff0c;而不是通过实例化新的对象。这种模式在需要创建相似对象时非常有用&#xff0c;尤其是当对象的创建过程比较昂贵或复杂时。 实现原理&#xff1a; 原型模式通过…

数据类型与运算符

关键字 C语言自己定义的一些单词 标识符//标志 定义 如变量&#xff0c;方法名&#xff0c;参数名&#xff0c;数组名等 要求 只有字母&#xff0c;数字下划线 不能以数字开头 不能用关键字 区分大小写 常量&#xff0c;变量 常量&#xff1a;不可变的量 变量&#xff1a;在程…

群辉docker安装sql server

安装步骤 开启群辉 SSH&#xff0c;通过 SSH 工具连接到群辉&#xff0c;运行下面的命令拉取mssql 2019 镜像 sudo docker pull mcr.microsoft.com/mssql/server:2019-latest然后在 docker 中就可以看到该镜像&#xff1a; 在群晖 docker 共享文件夹中创建 mssql2009 文件夹 …

【IEEE列表会议】IEEE第三届信息与通信工程国际会议国际会议(JCICE 2024)

会议简介 Brief Introduction 2024年第三届信息与通信工程国际会议国际会议 (JCICE 2024) 会议时间&#xff1a;2024年5月10日-12日 召开地点&#xff1a;中国福州 大会官网&#xff1a;JCICE 2024-2024 International Joint Conference on Information and Communication Engi…

LeetCode148题:排序链表(python3)

在数组排序中&#xff0c;常见的排序算法有&#xff1a;冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序等。 而对于链表排序而言&#xff0c;因为链表不支持随机访问&#xff0c;访问链表后面的节点只能依靠 next 指针从头…

13. 用户注册功能实现

文章目录 一 、增加路由二、书写流程控制&#xff08;controller&#xff09;逻辑三、书写业务逻辑四、与DB交互五、测试 代码地址&#xff1a;https://gitee.com/lymgoforIT/bluebell 一 、增加路由 添加路由&#xff0c;使用分组管理 v1 : r.Group("/api/v1")//…

springboot254小区团购管理

小区团购管理设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装小区团购管理软件来发挥其高效地信…

Discuz论坛网站报错Discuz!Database Error(0)notconnect的解决办法

运营服务器大本营有段时间了&#xff0c;在运营期间遇到两次Discuz&#xff01;Database Error&#xff08;0&#xff09;notconnect报错&#xff0c;和你们分享遇到Discuz报错的解决办法&#xff0c;希望可以帮助到你。 首先网站报错&#xff08;0&#xff09;notconnect&…

【力扣】208.实现Trie

实不相瞒&#xff0c;我怎么感觉洛谷里面的题目好难呢&#xff1f;虽然说万变不离其宗&#xff0c;但是我就觉得刷洛谷的题让我心情烦躁&#xff0c;刷不下去。于是今天我就刷力扣去了&#xff0c;明天继续挣扎吧&#xff01; 这道题目其实挺简单的&#xff0c;但是刚开始我没看…