【Linux】poll函数

poll和select的区别不大,主要是poll没有连接数限制,因为它用的链表实现

#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout);
struct pollfd {int   fd;         //要监控的文件描述符,如果fd为-1, 表示内核不再监控short events;     //输入参数, 表示告诉内核要监控的事件, 读事件, 写事件, 异常事件short revents;    //输出参数, 表示内核告诉应用程序有哪些文件描述符有事件发生
};
events/revents:POLLIN:可读事件POLLOUT: 可写事件POLLERR: 异常事件
nfds: 告诉内核监控的范围, 具体是: 数组下标的最大值+1 
timeout: =0: 不阻塞, 立刻返回-1: 表示一直阻塞, 直到有事件发生>0: 表示阻塞时长, 在时长范围内若有事件发生会立刻返回;如果超过了时长也会立刻返回
函数返回值:>0: 发生变化的文件描述符的个数=0: 没有文件描述符发生变化-1: 表示异常

使用poll来监控多个文件描述符进行客户端通信

代码:

#include "socketwrap.h"
#include <arpa/inet.h>
#include <poll.h>
#include <strings.h>
#include <string.h>
#include <ctype.h>#define POLLLEN 1024int main()
{int sfd = Socket(AF_INET, SOCK_STREAM, 0);// 设置端口复用int opt = 1;setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int));struct sockaddr_in soaddr;bzero(&soaddr, sizeof(soaddr));soaddr.sin_family = AF_INET;soaddr.sin_port = htons(9999);soaddr.sin_addr.s_addr = htonl(INADDR_ANY);Bind(sfd, (struct sockaddr *)&soaddr, sizeof(soaddr));// 监听-listenListen(sfd, 128);struct pollfd connfd[POLLLEN];int maxfd;  // 当前需要监听的最大的文件描述符int nready; // 返回的需要处理的个数int cfd;    // 通信描述符int i, maxi = 0;struct sockaddr_in clientsocket;socklen_t clilen;char buff[64]; // 通信数据// 初始化有效的文件描述符数组for (int i = 0; i < POLLLEN; i++){bzero(&connfd[i], sizeof(connfd[i]));connfd[i].fd = -1;}maxfd = sfd;connfd[0].fd = sfd;connfd[0].events = POLLIN;while (1){clilen = sizeof(clientsocket);bzero(&clientsocket, clilen);nready = poll(connfd, maxfd + 1, -1);if (nready < 0){if (errno == EINTR) // 被信号中断{continue;}perror("poll error");break;}if (nready > 0){if (connfd[0].revents == POLLIN){// 有连接到来cfd = Accept(sfd, (struct sockaddr *)&clientsocket, &clilen);for (i = 0; i < POLLLEN; i++){if (connfd[i].fd == -1){connfd[i].events = POLLIN;connfd[i].fd = cfd;maxi = i;if (maxfd < cfd){maxfd = cfd;}// 打印客户端的IP和PORTchar sIP[16];memset(sIP, 0x00, sizeof(sIP));printf("client [%s:%d] connect\n", inet_ntop(AF_INET, &clientsocket.sin_addr.s_addr, sIP, sizeof(sIP)), htons(clientsocket.sin_port));break;}}if (i == POLLLEN){close(cfd);printf("connect too much, server busy\n");continue;}if (--nready == 0){continue;}}for (i = 1; i <= maxi; i++){if (connfd[i].fd == -1){continue;}if (connfd[i].revents == POLLIN){// 有数据发送过来int n;int sockfd = connfd[i].fd;memset(buff, 0x00, sizeof(buff));n = Read(sockfd, buff, sizeof(buff));if (n < 0){perror("read over");close(sockfd);bzero(&connfd[i], sizeof(bzero));connfd[i].fd = -1; // 将connfd[i]置为-1,表示该位置可用}else if (n == 0){// printf("client is closed\n");close(sockfd);bzero(&connfd[i], sizeof(bzero));connfd[i].fd = -1; // 将connfd[i]置为-1,表示该位置可用}else{printf("[%d]:[%s]\n", n, buff);for (i = 0; i < n; i++){buff[i] = toupper(buff[i]);}Write(sockfd, buff, n);}if (--nready <= 0){break; // 注意这里是break,而不是continue, 应该是从最外层的while继续循环}}}}}close(sfd);return 0;
}

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

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

相关文章

Mysql学习笔记之SQL-1

上篇文章我们介绍了Mysql的安装&#xff0c;这篇文章我们介绍Mysql的操作语言SQL 1. 简介 sql全称&#xff08;Structured Query Language&#xff09;是结构化查询语言&#xff0c;操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库统一标准 2. sql分类 …

埃隆马斯克X-AI发布Grok-2大模型,快来体验~

引言 近年来&#xff0c;人工智能技术的快速发展推动了大语言模型的广泛应用。无论是日常生活中的智能助手&#xff0c;还是行业中的自动化解决方案&#xff0c;大语言模型都扮演着越来越重要的角色。2024年&#xff0c;X-AI推出了新一代的大模型——Grok-2&#xff0c;这款模…

PostgreSQL的学习心得和知识总结(一百六十三)|深入理解PostgreSQL数据库之 GUC参数compute_query_id 的使用和实现

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

基于自然的解决方案的学习

根据世界自然保护联盟&#xff08;IUCN&#xff09;的定义&#xff1a; “基于自然的解决方案&#xff08;NbS&#xff09;是保护、可持续管理和恢复自然的和被改变的生态系统的行动&#xff0c;能有效和适应性地应对社会挑战&#xff0c;同时提供人类福祉和生物多样性效益。”…

多线程编程杂谈(上)

问题 线程执行的过程中可以强制退出吗&#xff1f; 主动退出&#xff1f;被动退出&#xff1f; 问题抽象示例 需要解决的问题 g_run 全局变量需要保护吗&#xff1f; 如何编码使得线程中每行代码的执行可被 g_run 控制&#xff1f; 线程代码在被 g_run 控制并 "强制退…

【Git】:企业级开发和多人协作开发啊

目录 多人协作 模拟配置多人协作环境 多人同一分支开发 多人不同分支开发 远程分支删除后的问题 企业级开发模型 系统开发环境 分支设计规范 多人协作 模拟配置多人协作环境 目前&#xff0c;我们所完成的工作如下&#xff1a; 基本完成 Git 的所有本地库的相关操作&#xff…

【Sql优化】数据库优化方法、Explain使用

文章目录 一、金字塔优化模型二、SQL优化的利器&#xff1a;Explain工具1. Explain 的作用2. Explain 的用法 三、SQL优化方法&#xff08;后续文章细讲&#xff09;1. 创建索引减少扫描量2. 调整索引减少计算量3. 索引覆盖4. 干预执行计划5. SQL改写 四、通过 Explain 优化案例…

Deepmotion技术浅析(五):运动追踪

运动追踪是 DeepMotion 动作捕捉和 3D 重建流程中的核心模块之一。该模块的主要任务是在视频序列中跟踪人体的运动轨迹&#xff0c;捕捉人体各部分随时间的变化&#xff0c;并生成连续的 3D 运动数据。DeepMotion 的运动追踪技术结合了计算机视觉、深度学习和物理模拟等方法&am…

Android 系统应用重名install安装失败分析解决

Android 系统应用重名install安装失败分析解决 文章目录 Android 系统应用重名install安装失败分析解决一、前言1、Android Persistent apps 简单介绍 二、系统 persistent 应用直接安装需求分析解决1、系统应用安装报错返回的信息2、分析解决 三、其他1、persistent系统应用in…

使用Nexus3搭建npm私有仓库

一、npm介绍 npm的全称是Node Package Manager&#xff0c;它是一个开放源代码的命令行工具&#xff0c;用于安装、更新和管理Node.js模块。npm是Node.js的官方模块管理器&#xff0c;它允许用户从一个集中的仓库中下载和安装公共的Node.js模块&#xff0c;并将这些模块集成到…

【ChatGPT】解锁AI思维链:如何让机器像人类一样思考?

在人工智能领域&#xff0c;我们一直在追求让机器像人类一样思考。然而&#xff0c;即使是最先进的AI&#xff0c;也常常被诟病缺乏“常识”&#xff0c;难以理解复杂问题&#xff0c;更不用说像人类一样进行逻辑推理和解决问题了。最经常的表现就是遇到不会的地方&#xff0c;…

蓝桥杯刷题——day5

蓝桥杯刷题——day5 题目一题干解题思路一代码解题思路二代码 题目二题干解题思路代码 题目一 题干 给定n个整数 a1,a2,⋯ ,an&#xff0c;求它们两两相乘再相加的和&#xff0c;即&#xff1a; 示例一&#xff1a; 输入&#xff1a; 4 1 3 6 9 输出&#xff1a; 117 题目链…

监测预警智能分析中心建设项目方案

随着科技的不断进步&#xff0c;地理信息与遥感技术在国家治理、环境保护、灾害预警等领域发挥着越来越重要的作用。监测预警智能分析中心的建设&#xff0c;旨在通过集成先进的遥感技术、地理信息系统&#xff08;GIS&#xff09;、大数据分析和人工智能&#xff08;AI&#x…

【漫话机器学习系列】009.词袋模型(Bag of Words)

词袋模型&#xff08;Bag of Words, 简称 BoW&#xff09; 词袋模型是一种常见的文本表示方法&#xff0c;主要用于自然语言处理&#xff08;NLP&#xff09;和信息检索领域。它将文本数据转换为特征向量&#xff0c;忽略语序&#xff0c;仅考虑词的出现与否或出现频率。 1. 基…

vue3 setup语法,子组件点击一个元素打印了这个元素的下标id,怎么传递给父组件,让父组件去使用

问&#xff1a; vue3 setup语法&#xff0c;子组件点击一个元素打印了这个元素的下标id&#xff0c;怎么传递给父组件&#xff0c;让父组件去使用 回答&#xff1a; 在 Vue 3 中&#xff0c;你可以使用 setup 语法糖和组合式 API 来实现子组件向父组件传递数据。具体来说&am…

分治算法(单选题)

2-1 分数 2 下列多少种排序算法用了分治法&#xff1f; 堆排序插入排序归并排序快速排序选择排序希尔排序 A.2 B.3 C.4 D.5 正确答案 A 2-2 分数 2 分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题&#xff0c;分别解决问题&#xff0c;最后将子…

【栈】栈的定义及基本操作

1. 栈的定义和特点 定义&#xff1a;栈是限定尽在表尾进行插入或删除操作的线性表。 表头元素成为栈底&#xff0c;表尾元素成为栈顶。 特点&#xff1a;后进先出&#xff08;先进后出&#xff09; 2. 顺序栈 顺序栈是利用顺序存储结构实现的栈&#xff0c;即用一组连续…

UNIX简史

从1991年Linux出现至今&#xff0c;由于众多IT巨头以及技术社区的推动&#xff0c;Linux已经成为非常成熟、可用于各种关键领域的操作系统&#xff0c;适当了解其发展历史&#xff0c;对于理顺其技术流派、从而更好地学习和使用Linux具有重要意义。由于其基于UNIX系统二十多年的…

C# OpenCV机器视觉:畸变矫正

在一个阳光明媚的早晨&#xff0c;阿强决定去拍照。他拿起相机&#xff0c;穿上他最喜欢的羊毛大衣&#xff0c;准备记录下生活中的美好瞬间。可是&#xff0c;当他兴奋地查看照片时&#xff0c;发现自己拍的每一张都像是被外星人用变形金刚的力量扭曲过一样&#xff01;“这是…

读书|关于马斯克

于我而言&#xff0c;马斯克是一个有魅力的人&#xff0c;他张扬嚣张、却又一直做着惊世骇俗的事情。 关于健康 马斯克本身的工作就十分忙碌&#xff0c;但早年的他生活习惯也极其不规律&#xff0c;睡眠不足、饮食糊弄、懒得运动。健康三要素一个不占。另外&#xff0c; 42 …