一般poll使用过程中都是检测POLLIN事件,表示描述符有事件可以处理了,需要我们处理。对POLLOUT事件触发的方式相对较少,网上也有很多对此触发的疑问,利用实际项目中用的一个用法,下面做了个测试,

struct pollfd {

int fd;        //文件描述符

short events;  //要求查询的事件掩码

short revents; //返回的事件掩码

};

int poll(struct pollfd *ufds, unsigned int nfds, int timeout);

poll函数使用pollfd类型的结构来监控一组文件句柄,ufds是要监控的文件句柄集合,nfds是监控的文件句柄数量,timeout是等待的毫秒数,这段时间内无论I/O是否准备好,poll都会返回。timeout为负数表示无线等待,timeout为0表示调用后立即返回。执行结果:为0表示超时前没有任何事件发生;-1表示失败;成功则返回结构体中revents不为0的文件描述符个数

#define POLLIN 0x0001 /* There is data to read */
#define POLLPRI 0x0002 /* There is urgent data to read */
#define POLLOUT 0x0004 /* Writing now will not block */
#define POLLERR 0x0008 /* Error condition */
#define POLLHUP 0x0010 /* Hung up */
#define POLLNVAL 0x0020 /* Invalid request: fd not open */

#include <poll.h>
#include <stdio.h>
#include <sys/socket.h>
#include <errno.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <string.h> int main()
{
struct pollfd pfd;
int fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int nonblocking = 1; int flags = fcntl(fd, F_GETFL, 0); //获取文件的flags值。
int ret = fcntl(fd, F_SETFL, flags | O_NONBLOCK); //设置成非阻塞模式; struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(443); //测试的服务端口
//serv_addr.sin_addr.s_addr = htonl("127.0.0.1"); //本地所有的IP
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); printf("fd:%d,ret:%d\n",fd,ret); if (connect(fd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) != 0 && errno == EINPROGRESS) {
printf("err connect:%s\n", strerror(errno));
while (1) {
if (connect(fd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == 0) {
printf("retry connect success\n");
break;
}
}
}else {
printf("connect success, err:%s\n",strerror(errno));
}
pfd.fd = fd;
//pfd.events = POLLIN;//POLLIN:0x0001 POLLOUT:0x0004
pfd.events = POLLOUT;//POLLIN:0x0001 POLLOUT:0x0004
pfd.revents = 0; ret = poll(&pfd, 1, 100);
printf("poll ret:%d event:%d, revent:%d, err:%s, errno:%d\n",ret,pfd.events, pfd.revents, strerror(errno));
return 0;
}

PULLIN测试结果:

[root@cloud ]#./poll
fd:3,ret:0
err connect:Operation now in progress
retry connect success
poll ret:0 event:1, revent:0, err:Operation now in progress, errno:0

说明:套接字连接成功之后poll POLLIN事件,poll返回值是0即没有准备好的可读的事件,期望事件和实际轮询的事件不一样。

PULLOUT测试结果:

[root@cloud ]#./poll
fd:3,ret:0
err connect:Operation now in progress
retry connect success
poll ret:1 event:4, revent:4, err:Operation now in progress, errno:0
说明:套接字连接成功之后poll POLLOUT事件,poll返回值是1即表示准备好写,期望事件和实际轮询的事件都是写事件。

可以应用场景说明:1.队列中只有个待发送的数据包  2.要发送数据包再立即接收响应

POLLOUT/POLLINT事件触发测试的更多相关文章

  1. NUnit实战,第一个测试类,测试事件触发是否是并行的

    以前测试都是新建一个控制台测试的方式来进行,感觉版本管理啥的非常麻烦.也是非常原始的办法.后来想以前有写过测试单元,不过好久没弄了.Nuget了NUnit后写了正式的第一个测试类. 测试用例: 测试事 ...

  2. 关于Application_End 与 Application_Start事件触发情况的测试(待续)

    测试项目搭建 定义一个简单的Mvc项目,有如下文件: (1) public class Startup { public void Configuration(IAppBuilder app) { a ...

  3. 关于input的file框onchange事件触发一次失效的新的解决方法

    在google了众多方法后,网上有这么几种方法: 1.替换掉原来的input框 2.remove原来的input框,然后在添加进新的一样的input框 但是不知道为什么非常不幸的是,怎么弄我都弄不出. ...

  4. [转载] 理解 epoll 的事件触发机制

    原文: http://weibo.com/p/1001603862394207076573?sudaref=weibo.com epoll的I/O事件触发方式有两种模式:ET(Edge Trigger ...

  5. 为什么DropDownList的SelectedIndexChanged事件触发不了

    写的还行,转来大家看看 为什么DropDownList的SelectedIndexChanged事件触发不了? 为什么设置了DropDownList的AutoPostBack="True&q ...

  6. html元素双击事件触发机制猜想及疑惑

    今天有个同事遇到一个奇怪的问题,我照着他的代码做了一些简化写了这个demo <!DOCTYPE html> <html> <head> <style type ...

  7. sencha touch list(列表) item(单行)单击事件触发顺序

    测试代码如下 Ext.define('app.view.new.List', { alternateClassName: 'newList', extend: 'app.view.util.MyLis ...

  8. 2019-11-29-WPF-多个-StylusPlugIn-的事件触发顺序

    原文:2019-11-29-WPF-多个-StylusPlugIn-的事件触发顺序 title author date CreateTime categories WPF 多个 StylusPlugI ...

  9. 2019-10-21-WPF-多个-StylusPlugIn-的事件触发顺序

    title author date CreateTime categories WPF 多个 StylusPlugIn 的事件触发顺序 lindexi 2019-10-21 08:33:15 +080 ...

随机推荐

  1. Go并发编程--Mutex/RWMutex

    目录 一.前言 二. Mutex 2.1 案例 三. 实现原理 3.1 锁的实现模式 3.2 Go Mutex 实现原理 3.2.1 加锁 3.2.2 解锁 四. 源码分析 4.1 Mutex基本结构 ...

  2. hdu 5087 Revenge of LIS II (DP)

    题意: N个数,求第二长上升子序列的长度. 数据范围: 1. 1 <= T <= 1002. 2 <= N <= 10003. 1 <= Ai <= 1 000 0 ...

  3. 【Java】String和List类型转换

    String & List String ==>List //方法一 List<String> list = Arrays.asList(str.split(",& ...

  4. [Vue warn]: Unknown custom element: <sapn> - did you register the component correctly? For recursive components, make sure to provide the "name" option. found in ---> <Evaluate> at src/views/index/

    关于vue报错: [Vue warn]: Unknown custom element: <sapn> - did you register the component correctly ...

  5. java中使用Process执行linux命令

    代码如下 BufferedReader reader = null; String cmd = "netstat -anp|grep :8080";//命令中有管道符 | 需要如下 ...

  6. 2017final英文语句格式简单检查

    英文书写中,句首字母通常为大写,其余为小写,单词"I"除外,单词与单词之间用一个空格隔开,句中用","断句,句末用"."结束,", ...

  7. Python基础(slice切片)

    l = ['傻狗1','傻狗2','傻狗3','傻狗4','傻狗5','傻狗6'] print(l[0:3])#['傻狗1', '傻狗2', '傻狗3'] numbers = list(range(1 ...

  8. Django笔记&教程 5-1 基础增删查改

    Django 自学笔记兼学习教程第5章第1节--基础增删查改 点击查看教程总目录 第四章介绍了模型类models.Model和创建模型,相当于介绍了数据库表和如何创建数据库表. 这一章将介绍如何使用模 ...

  9. 基于EPPlus和NPOI实现的Excel导入导出

    基于EPPlus和NPOI实现的Excel导入导出 CollapseNav.Net.Tool.Excel(NuGet地址) 太长不看 导入 excel 文件流将会转为 ExcelTestDto 类型的 ...

  10. win10让人愤怒的磁盘占用100%问题

    升级win10以后其他还好.但是系统经常响应非常非常慢,后来观察发现每次非常卡的时候我的磁盘占用就是100%的. 我是技嘉的B85主板. 1盘是128g的东芝SSD(GPT), 2盘是WD的3TB H ...