4.28 poll API介绍及代码编写

#include <poll.h>
struct pollfd{int fd;//委托内核检测的文件描述符short events;//委托内核检测文件描述符的什么事件short revents;//文件描述符实际发生的事件
};
int poll(struct pollfd *fds,nfds_t nfds,int timeout);-参数:-fds:是一个struct pollfd结构体数组,这是一个需要检测的文件描述符的集合-nfds:这是第一个参数数组中最后一个有效元素的下标+1-timeout:阻塞时长0:不阻塞-1:阻塞,当检测到需要检测的文件描述符有变化,解除阻塞>0:阻塞的时长,单位毫秒-返回值:-1:失败>0:成功,返回n表示检测到集合中有n个文件描述符发生变化


当检测两个事件时,使用或操作:

struct pollfd myfd;
myfd.fd=5;
myfd.events=PLLIN|POLLOUT;//同时检测读事件和写事件

代码实现
client.c

#include <stdio.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>int main(){//1.创建一个用于通信的socketint fd=socket(PF_INET,SOCK_STREAM,0);if(fd==-1){perror("socket");return -1;}//指定连接的服务器的IP和端口struct sockaddr_in seraddr;inet_pton(AF_INET,"127.0.0.1",&seraddr.sin_addr.s_addr);seraddr.sin_family=AF_INET;seraddr.sin_port=htons(9999);//2.连接服务器int ret=connect(fd,(struct sockaddr *)&seraddr,sizeof(seraddr));if(ret==-1){perror("connect");return -1;}//3.连接成功了,客户端可以直接和服务端通信(接收数据,发送数据)int num=0;while(1){char sendBuf[1024]={0};sprintf(sendBuf,"send data %d",num++);//发送数据write(fd,sendBuf,strlen(sendBuf)+1);//接收数据int len=read(fd,sendBuf,sizeof(sendBuf));if(len==-1){perror("read");return -1;}else if(len>0){printf("read buf=%s\n",sendBuf);}else{printf("服务器已经断开连接...\n");break;}usleep(1000);}//4.通信结束,断开连接close(fd);return 0;
}

poll.c

#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <poll.h>int main(){//1、创建一个用于监听的套接字int lfd=socket(PF_INET,SOCK_STREAM,0);//本地服务器的地址信息(IP和端口)struct sockaddr_in saddr;saddr.sin_port=htons(9999);saddr.sin_family=AF_INET;saddr.sin_addr.s_addr=INADDR_ANY;//2、将监听文件描述符和本地IP和端口绑定bind(lfd,(struct sockaddr *)&saddr,sizeof(saddr));//3、设置监听,监听的fd开始工作listen(lfd,8);//初始化检测的文件描述符数组struct pollfd fds[1024];for(int i=0;i<1024;++i){fds[i].fd=-1;fds[i].events=POLLIN;//检测读事件}fds[0].fd=lfd;//下标0表示监听描述符int nfds=0;while(1){//调用poll系统函数,让内核帮忙检测哪些文件描述符有数据int ret=poll(fds,nfds+1,-1);if(ret==-1){perror("poll");exit(-1);}else if(ret==0){continue;}else if(ret>0){//说明检测到了有文件描述符的对应缓冲区数据发生改变if(fds[0].revents&POLLIN){//表示有新客户端连接进来struct sockaddr_in cliaddr;int len=sizeof(cliaddr);int cfd=accept(lfd,(struct sockaddr *)&cliaddr,&len);//将新的文件描述符加入到集合中for(int i=1;i<1024;++i){if(fds[i].fd==-1){fds[i].fd=cfd;fds[i].events=POLLIN;break;}}//更新最大的文件描述符索引nfds=nfds>cfd?nfds:cfd;}for(int i=1;i<=nfds;++i){if(fds[i].revents&POLLIN){//说明这个文件描述符对应的客户端发来了数据char buf[1024]={0};//接收数据int len=read(fds[i].fd,buf,sizeof(buf));if(len==-1){perror("read");exit(-1);}else if(len==0){printf("client closed...\n");close(fds[i].fd);//通信结束,断开连接fds[i].fd=-1;}else if(len>0){printf("read buf=%s\n",buf);//发送数据write(fds[i].fd,buf,strlen(buf)+1);}}}}}close(lfd);return 0;
}

4.28 poll API介绍及代码编写相关推荐

  1. 【Linux】网络编程三:TCP通信和UDP通信介绍及代码编写

    参考连接:https://www.nowcoder.com/study/live/504/2/16. [Linux]网络编程一:网络结构模式.MAC/IP/端口.网络模型.协议及网络通信过程简单介绍 ...

  2. 【审批工作流camunda教程】(四):不使用camunda-modeler,使用Fluent Builder API,代码编写流程定义并部署

    教程一: 创建camunda项目=>部署流程定义=>创建流程实例=>走完流程实例 教程二: camunda数据库中的48张表分别的大致含义,数据库表结构介绍 教程三: 下载camun ...

  3. 高德地图API的开发与代码编写

    高德地图API的开发与代码编写 高德地图底层源码 /** 高德autonavi 地图API Define:begin */ var AutoNaviMap = function(mapOption){ ...

  4. promise的状态以及api介绍_2019年,盘点一些我出过的前端面试题以及对求职者的建议

    笔者虽然曾经也面试过很多求职者,但是对于前端的笔试和面试,我觉得并不能体现一个人的真实能力,所以建议大家多修炼前端真正的技术.对于前端面试题,之前也承诺过读者要出一篇,笔者大致总结一下曾经面试的题目. ...

  5. 响应式编程笔记(二):代码编写

    2019独角兽企业重金招聘Python工程师标准>>> 响应式编程笔记(二):代码编写 博客分类: 架构 原文:Notes on Reactive Programming Part ...

  6. 30条HTML代码编写指南 for入门者

    本文总结了30条html代码编写指南,只要在编写HTML代码的过程中牢记它们,灵活运用,你一定会写出一手漂亮的代码,早日迈入专业开发者的行列. 1. 一定要闭合HTML标签 在以往的页面源代码里,经常 ...

  7. 组合筛选vue_Vue 3 组合式API介绍

    组合式API介绍 通过创建 Vue 组件,我们可以将接口的可重复部分及其功能提取到可重用的代码段中.仅此一项就可以使我们的应用程序在可维护性和灵活性方面走得更远.然而,我们的经验已经证明,光靠这一点可 ...

  8. [Android] DownloadManager下载管理类2.3新增API介绍

    从Android 2.3开始新增了一个下载管理类,在SDK的文档中我们查找android.app.DownloadManager可以看到.下载管理类可以长期处理多个HTTP下载任务,客户端只需要给出请 ...

  9. 【Go API 开发实战 3】API 流程和代码结构

    API 流程和代码结构 为了使读者在开始实战之前对 API 开发有个整体的了解,这里选择了两个流程来介绍: HTTP API 服务器启动流程 HTTP 请求处理流程 本小节也提前给出了程序代码结构图, ...

最新文章

  1. mysql5.7版本源_用最新MySQL 8.0的源安裝MySQL 5.7版本(CentOS 7環境下)
  2. 中国汽车零部件行业需求预测及投资前景建议报告2022-2028年版
  3. python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解
  4. 面试官问:一个Java字符串中到底能有多少个字符?
  5. 转 SPI和API的区别
  6. 大师兄科研网_挑战杯经验分享会与你话科研
  7. playwright-python 截图、录制视频、录制接口(二)
  8. 工作的硬实力/软技巧
  9. 计算机学硕毕业论文字数,华科硕士毕业论文几多要求?
  10. JS 获取第一个和最后一个,子节点、子元素
  11. 使用联邦学习解决推荐系统中的隐私泄露问题
  12. [图形学] 坐标系变换——从世界坐标系到相机坐标系
  13. Windows cmd 进入其他盘
  14. torch.unsqueeze(input, dim)函数
  15. (陆续更新)Macbook好用工具推荐
  16. RobeiEDA 8位移位寄存器
  17. win10系统日志事件ID 10016
  18. Ubuntu虚拟机安装手札
  19. Unity3DAnimator中动画完成后切换其他动画
  20. OTRS工单管理系统

热门文章

  1. 微信小程序 获得用户输入内容
  2. 微信小程序(第十五章)- 我的页面的实现
  3. 四川高安版华为6110T刷机固件_ca_sccdx免费系统线刷包及教程
  4. 小易爱回文(网易2021校招笔试-)
  5. 转:资源 | 我爱自然语言处理
  6. 2021年材料员-岗位技能(材料员)考试及材料员-岗位技能(材料员)模拟考试题库
  7. 解决kswapd0 CPU占用率高的问题
  8. 双硬盘,一个SSD+一个机械硬盘,卡顿明显及机械硬盘掉盘解决方法
  9. Eclipse中的add import与organize imports有什么区别
  10. RecyclerView的使用(一)