对于poll的总结

2023-11-13

     参考书籍:linux高性能服务器编程,是个人对看书的总结,上文一致

    poll系统调用和select类似,(个人认为poll和select掌握一个就好了)也是在指定时间内轮询一定数量的文件描述符,以测试其中是否有就绪者。

    关于poll的原型

     #include <poll.h>

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

     (1)fds参数是一个pollfd结构类型的数组,它指定我们所有的感兴趣的文件描述符上发生的可读可写和异常等事件。pollfd结构体的定义如下:

      struct pollfd

      {

            int fd;//文件描述符

            short events;//注册的事件,在这里声明我们要关心的事件是什么

            short revents;//实际发生的事件,由内核填充,这个我们是不用去管的

       }

       poll有许多的事件类型,我目前接触或者说用到的是

       POLLIN,数据可读(包括普通数据和优先数据)

       POLLRDHUP,TCP连接被对方关闭,或者对方关闭了写操作,他由GUN引入

       POLLHUP,挂起,比如管道的写端被关闭后,读端描述符上将收到POLLHUP事件。

       通常,应用程序需要recv调用的返回值来区分socket上面接收到的是有效数据还是对方关闭连接的请求,并做相应的处理。但是poll可以通过POLLRDHUP事件来进行判断。

        (2)对于nfds,他制定的是被监听事件集合fds的大小。

        (3)对于timeout他的单位是毫秒制定的是poll的超时值,当timeout是-1,poll调用将一直阻塞,直到某个事件发生;当timeout为0,那么poll调用将立即返回。

        poll返回值的含义和selec相同,,如果超时且没有任何描述符就绪,那么返回0,如果失败则返回-1,如果成功那么就返回就绪文件描述符的总数,如果在等待期间接收到了信

号那就返回-1。


用poll监听其他进程发来信息的代码

#include <stdio.h>
#include <assert.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <poll.h>


int main()
{
   int sockfd = socket(AF_INET,SOCK_STREAM,0);
   assert(sockfd!=-1);


   struct sockaddr_in saddr,caddr;


   saddr.sin_family = AF_INET;
   saddr.sin_port = htons(6500);
   saddr.sin_addr.s_addr = inet_addr("192.168.1.11");


   int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
   assert(res!=-1);


   int ret = listen(sockfd,5);
   assert(ret!=-1);


   int len = sizeof(caddr);
   int c = accept(sockfd,(struct sockaddr*)&caddr,&len);




    struct pollfd rdset;//read
    //init
    rdset.fd = c;//choose
    rdset.events = POLLIN;
    rdset.revents = 0;


    while(1)
    {
         int n = poll(&rdset,1,0);
         if(n<0)
         {
              break;
         }


         if(n>0)
         {
             char buff[128] = {0};
             int ret = recv(c,buff,127,0);
             if(ret<=0)
             {
                  printf("over!");
                  break;
             }
             printf("%s",buff);
         }
    }
    return 0;
}

         

相应的客户端代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


int main(int argc,char *argv[])
{
   int sockfd = socket(AF_INET,SOCK_STREAM,0);
   assert(sockfd!=-1);


   struct sockaddr_in saddr;//虽然操作一样,但是客户端是为了去链接服务端
   memset(&saddr,0,sizeof(saddr));
   saddr.sin_family = AF_INET;
   saddr.sin_port = htons(6500);//转换成大端
   saddr.sin_addr.s_addr = inet_addr("192.168.1.11");
 //要用就必须先运行起来
   int res = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));//链接到服务端上面
   assert(res!=-1);
   //执行到这个地方说明三次握手完成


   while(1)
   {
       printf("input:\n");
       char buff[128] = {0};


       fgets(buff,128,stdin);//fgets会用到空格回车
       if(strncmp(buff,"end",3)==0)
       {
           break;
       }


       send(sockfd,buff,strlen(buff),0);//把收到的讯息再发送出去
       memset(buff,0,128);
   }


   close(sockfd);//关闭
   return 0;
}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于poll的总结 的相关文章

  • java日志框架详解

    一 日志的概念 日志文件是用于记录系统操作事件的文件集合 可分为事件日志和消息日志 具有处理历史数据 诊断 问题的追踪以及理解系统的活动等重要作用 二 现有的日志框架 JUL java util logging logback log4j
  • Swagger注解详解

    目录 1 Api 2 APiOperation 3 ApiImplicitParams 4 ApiResponses 5 ApiModel 6 ApiModelProperty 这里是说明常用注解的含义和基本用法 也就是说已经对swagge
  • 使用反射对单例模式进行攻击的讨论

    我们都知道在单例模式中 对构造函数进行私有化private修饰 保证了类不能使用new进行对象的实例化 但是如果使用反射获取构造函数 在进行实例化就会导致private失效 作者用中文作为类名 请读者勿怪 纯属喜好 工作中是不允许的哦 ja
  • 为什么我们要考虑线性规划的对偶问题?

    文章转自 https www zhihu com question 26658861 版权归原作者
  • 更改计算机bios密码怎么办,计算机BIOS通用密码的修改

    电脑信息的保密一直是一个重要的话题 众所周知 在BIOS设置菜单中 有两个密码设置栏目 Supervisor Password 超级用户密码 和User Password 一般用户密码 可以说是电脑资料保密的第一道防线 这两组密码搭配BIO
  • 2023届秋招,我重新认清了自己

    仅记录个人经历 充满主观感受 甚至纯属虚构 仅供参考 杠就是你对 本想毕业再写 但是考虑到等毕业了 24秋招的提前批就快开始了 大概就来不及了 正好现在有点时间 陆陆续续的写了出来 个人情况 学历 苏北二本 加南京某211 现在二本三本合并
  • 【转载】PMOS,NMOS

    NMOS保证截止 发生在G电位小于等于S PMOS保证截止 发生在G电位大于等于S 寄生二极管是因为基底与Source连接形成的PN结
  • JQuery获取多个name相同select/input框的value值

    JavaWeb jsp页面 使用c forEach 循环多个select下拉框 name相同获取被选中的值 jsp
  • 虚拟机连接不上网络,解决办法

    虚拟机连接不上网络解决思路 简单的介绍了VM虚拟机常用的三种网络连接方式 一般用NAT方式虚拟机就很容易上网的 所以一般没有特殊要求推荐用NAT方式 1 桥接 就是把虚拟机通过VMnet0桥接到主机的本地连接 现在虚拟机是通过VMnet0与
  • NestedScrollView RecycleView 嵌套 滑动冲突

    NestedScrollView RecycleView 嵌套 滑动冲突 场景描述 效果演示 实现思路 问题和优化 优化 参考文档 场景描述 使用NestedScrollView 内嵌RecycleView时 当用户上滑时 NestedSc
  • 扫雷(初阶)

    细节决定成败 目录 打印菜单 创建棋盘并打印 埋雷 排雷 判断输赢 扫雷游戏规则 当棋盘内除去有地雷的格子 全被排除那么就会胜利 反之当玩家排到一颗雷就会被炸西 根据三子棋的写法 扫雷程序也是需要分为几个文件 声明函数的文件 定义函数的文件
  • Samba+ldap认证(LDAP搭建)

    Samba ldap认证 题目 LDAP 一 关闭Selinux跟防火墙 二 安装ldap 三 设置slapd密码 四 修改配置文件 五 启动服务ldap服务并导入基本Schema 六 导入基础数据库和用户组 七 导入用户 八 修改配置文件
  • Qt的内存管理机制

    当我们在使用Qt时不可避免得需要接触到内存的分配和使用 即使是在使用Python Golang这种带有自动垃圾回收器 GC 的语言时我们仍然需要对Qt的内存管理机制有所了解 以更加清楚的认识Qt对象的生命周期并在适当的时机加以控制或者避免进
  • go语言连接mysql数据库,并验证连通性

    go语言连接mysql数据库 并验证连通性 package main import database sql sql Open加载包 github com go sql driver mysql 没用到包里的内容但是需要加载一下这个包 lo
  • 2023年MathorCup 高校数学建模挑战赛-A 题 量子计算机在信用评分卡组合优化中的应用-思路详解(模型代码答案)

    一 题目简析 运筹优化类题目 不同于目标规划 该题限制了必须使用量子退火算法QUBO来进行建模与求解 本身题目并不难 但是该模型较生僻 给出的参考文献需要耗费大量时间去钻研 建议擅长运筹类题目且建模能力强的队伍选择 二 逐问思路分享 问题
  • 连续子序列最大最小值差额最大化

    本文为最近做过的一道编程笔试题 代码实现方式多种多样 此处本人提供的代码可以获得正确解 仅供大家参考 目录 一 题目描述 二 实现代码程序 三 测试结果截图 一 题目描述 题目描述 Mike在一家律师事务所工作 他的老板Harvey分配给他
  • Git vscode-git ssh新建和验证

    在push本地仓库遇到的SSH公钥认证问题 Warning Permanently added github com xx xxx xxx xxx ECDSA to the list of known hosts git github co
  • 牛客网基础语法1~10题

    牛客网基础语法1 10题 前言 今天是咱们第一期刷牛客网上的题目 目标 掌握基础编程 打牢基础知识 有一定的编程思想 鸡汤 读不在三更五鼓 功只怕一曝十寒 先干为敬 大家随意 第一题 include
  • tensorflow报错raise RuntimeError('The Session graph is empty.  Add operations to the ' RuntimeError:

    tensorflow报错raise RuntimeError The Session graph is empty Add operations to the RuntimeError The Session graph is empty
  • 3.5安装ideay、快捷键

    注册账号 网址 https www jetbrains com 绑定激活码 网址 https www jetbrains com store redeem Alt Enter 快速补全 Ctrl shift O 清理导包 去除无用的包 Ct

随机推荐

  • Android Alarm闹钟API使用心得

    前言 有什么办法可以在不打开App的时候 也能够触发一些操作呢 比如说发送通知 解决这个需求的办法有很多种选择 比如说官方推荐的WorkManager API 可以在后台执行一次性 耗时 定时的任务 但WorkManager是严格遵循电池优
  • MySQL配置了主从,重启步骤

    停应用 gt 停数据库 先备后主 gt 启数据库 先主后备 gt 启应用 关闭MySQL从库 在从库操作 a 先查看当前的主从同步状态 show slave status G 看是否双yes b 执行stop slave c 停止从库服务
  • CUDA与已有的VS项目结合

    先新建一个简单的控制台应用程序 项目名称为Test00301 如下图所示 然后在项目中新建一个名为Test01 cu文件 如下图所示 然后在解决方案资源管理器中选择该项目并点击右键 在弹出的菜单中选择 生成自定义 如下图所示 在弹出的 Vi
  • 关于Selenium WebDriver的geckodriver

    Selenium作为网站UI测试利器 为黑盒功能测试人员所喜爱 下载Selenium的最新版本地址 http selenium release storage googleapis com index html 友情提示 如果一直下载不了
  • 【IDEA】windows、mac下IDEA下载的驱动包在哪

    1 概述 因为我们是内外网分离的 内网不连接网络 因此在内网的IDEA下载驱动包的的时候 遇到问题 然后因为不知道需要什么样的驱动包 然后就先在外网找了一下 然后在拷贝到内网 打算这么做 mac 下 System Volumes Data
  • flutter混编ios打包生成ipa文件

    项目场景 flutter集成到原有ios项目上 将项目打包生成ipa文件 在通过爱思助手或者分发服务器分发安装 解决方案 1 在flutter module项目路径下 通过以下命令打包 其中 no codesign表示不使用证书签名 后续会
  • AvalonJs入门二 复选框全选反选+layui分页

    前言 今天给大家带来初识Avalon的第二篇文章 复选框的全选操作和Avalon layUI的分页 Demo1 神奇的全选反选 Avalon的双工绑定duplex和监听事件 watch 第一篇文章的第一个例子大家是否还记得 文本框输入什么内
  • Vue.js之事件的绑定(v-on: 或者 @ )

    1 Vue js事件绑定的一般格式 v on click function v on click mouseout mouseover click 2 Vue js事件绑定的实现 2 1 JavaScript代码
  • STM32 使用HAL库实现微秒级长延时

    STM32 使用HAL库实现微秒级长延时 背景 定时器初始化 主程序中的设计 背景 STM32 HAL库中有一个延时函数HAL Delay 可以实现毫秒级的延时 能够满足一般延时需求 在有些场合下 我们需要更精准的延时 同时可能会有较长时间
  • 智慧校园小程序-微信小程序毕业设计(附下载链接)

    2023年微信小程序毕业设计 智慧校园 点我下载项目资源 智慧校园小程序 校园是一个充满创造力和活力的地方 教育和互联网发展向纵深发展 智慧校园小程序开发是当前校园建设中不可或缺的互联网工具 通过智慧校园小程序 可以整合更多的校园服务基础设
  • 2022年油价的暴涨让你意识到了什么?

    2022年才刚刚开始 油价便以迅雷不及掩耳之势快速上涨几次 从本月3月3日24时起 油价上升之窗开启 从全国来看 92号汽油每升上涨0 2元 95号汽油每升上涨0 22元 0号柴油也不甘落后也每升上涨0 22元 而近几天国际原油价格上升幅度
  • 【目标检测】33、AutoAssign:Differentiable Label Assignment for Dense Object Detection

    文章目录 一 背景 二 方法 2 1 Prior level Center Weighting 2 2 Instance level Confidence Weighting 2 3 Loss 三 效果 论文 AutoAssign Diff
  • Oracle 10g RAC Dataguard Faileover

    环境 1 Oracle 10g RAC Oracle 10g RAC Dataguard最大性能模式配置 2 rac1 rac2 Primary Database 3 vmrac1 vmrac2 Physical Standby Datab
  • C语言课设学生籍贯信息记录簿(大作业)

    一 任务概述 文章仅供参考 进一步掌握和利用C语言进行课程设计的能力 进一步理解和运用结构化程序设计的思想和方法 初步掌握开发一个小型实用系统的基本方法 二 设计功能 1 创建信息链表并以磁盘文件保存 2 读取磁盘文件并显示输出所有学生的籍
  • alibaba druid数据库连接池详解

    1 介绍 Druid连接池是阿里巴巴开源的数据库连接池项目 Druid连接池为监控而生 内置强大的监控功能 监控特性不影响性能 功能强大 能防SQL注入 内置Loging能诊断Hack应用行为 2 下载 git地址 https github
  • 漏洞信息收集之——指纹识别

    指纹识别 目录 指纹识别 目的 常见指纹检测的对象 常见指纹识别方式 1 特定文件的MD5 2 正常页面或错误网页中包含的关键字 3 请求头信息的关键字匹配 4 部分URL中包含的关键字 比如wp includes dede等URL关键特征
  • luci 开发中一些小总结

    一 只保存不应用 当修改或者增加一项配置后 如果不是点击 保存 应用 按钮 而是点击 保存 按钮 这些配置不会保存各个到配置文件中 而是暂时保存到如下临时目录下 tmp uci 例如 当修改了网络配置 没有应用时 会生成一个 tmp uci
  • vue-quill-editor富文本编辑器多个音频上传显示覆盖问题

    新建的时候没有问题 正常提交 修改时候后台传过来的数据正确 但是渲染会导致前一个audio被后面一个覆盖掉 刷新audio标签就没有了 1 覆盖问题 将代码 that refs editRef content data content 改成
  • vue拖拽实现app或小程序装修界面

    vue拖拽实现app或小程序装修 一 最终效果图 参考引用作者 作者 李白不吃茶v 原作者源代码git地址 大神的源代码 这里是引用 二 需要安装的依赖 安装 vuedraggable 语法 npm install vuedraggable
  • 对于poll的总结

    参考书籍 linux高性能服务器编程 是个人对看书的总结 上文一致 poll系统调用和select类似 个人认为poll和select掌握一个就好了 也是在指定时间内轮询一定数量的文件描述符 以测试其中是否有就绪者 关于poll的原型 in