POLLOUT/POLLINT事件触发测试
一般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事件触发测试的更多相关文章
- NUnit实战,第一个测试类,测试事件触发是否是并行的
以前测试都是新建一个控制台测试的方式来进行,感觉版本管理啥的非常麻烦.也是非常原始的办法.后来想以前有写过测试单元,不过好久没弄了.Nuget了NUnit后写了正式的第一个测试类. 测试用例: 测试事 ...
- 关于Application_End 与 Application_Start事件触发情况的测试(待续)
测试项目搭建 定义一个简单的Mvc项目,有如下文件: (1) public class Startup { public void Configuration(IAppBuilder app) { a ...
- 关于input的file框onchange事件触发一次失效的新的解决方法
在google了众多方法后,网上有这么几种方法: 1.替换掉原来的input框 2.remove原来的input框,然后在添加进新的一样的input框 但是不知道为什么非常不幸的是,怎么弄我都弄不出. ...
- [转载] 理解 epoll 的事件触发机制
原文: http://weibo.com/p/1001603862394207076573?sudaref=weibo.com epoll的I/O事件触发方式有两种模式:ET(Edge Trigger ...
- 为什么DropDownList的SelectedIndexChanged事件触发不了
写的还行,转来大家看看 为什么DropDownList的SelectedIndexChanged事件触发不了? 为什么设置了DropDownList的AutoPostBack="True&q ...
- html元素双击事件触发机制猜想及疑惑
今天有个同事遇到一个奇怪的问题,我照着他的代码做了一些简化写了这个demo <!DOCTYPE html> <html> <head> <style type ...
- sencha touch list(列表) item(单行)单击事件触发顺序
测试代码如下 Ext.define('app.view.new.List', { alternateClassName: 'newList', extend: 'app.view.util.MyLis ...
- 2019-11-29-WPF-多个-StylusPlugIn-的事件触发顺序
原文:2019-11-29-WPF-多个-StylusPlugIn-的事件触发顺序 title author date CreateTime categories WPF 多个 StylusPlugI ...
- 2019-10-21-WPF-多个-StylusPlugIn-的事件触发顺序
title author date CreateTime categories WPF 多个 StylusPlugIn 的事件触发顺序 lindexi 2019-10-21 08:33:15 +080 ...
随机推荐
- 万能构造解决Rolle中值问题
只要原函数是两个函数的乘积形式,皆可此构造.
- 嵌入式开发板nfs挂载
板子要开始调试了,第一个头大的问题就是调试过程中更新的文件怎么更新到板子上,以前用sd卡拷贝来来回回太浪费时间了,adb也需要接线各种连接操作. 现在板子有wifi可用,是时候把nfs共享搭起来了. ...
- 整数中1出现的次数 牛客网 剑指Offer
整数中1出现的次数 牛客网 剑指Offer 题目描述 求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此 ...
- hdu 1847 Good Luck in CET-4 Everybody! (简单博弈)
题意: n张牌,双方轮流抓取.每人每次抓取的牌数必须是2的幂次(1,2,4,8...). 最后抓完的人胜. 思路 : 考虑剩3张牌,后手胜. 考虑3的倍数.假设先抓者当轮抓2x 张,2x %3等于1或 ...
- vue禁用浏览器回退
解决方案 mounted() { history.pushState(null, null, document.URL) window.addEventListener('popstate', () ...
- Celery Received unregistered task of type
celery -A proj worker --loglevel=info 这个错误原因在于proj这里没有包含对应的task, 可以在这里导入需要的task即可
- QT6 源码杂记
菜鸡一个,随便写写,勿喷.好记性不如烂笔头. 了解qt,第一个绕不过的坎便是qt的元对象系统 QMetaObject. 1 class Object : public QObject 2 { 3 Q_ ...
- 001.AD域控简介及使用
一 AD概述 1.1 AD简介 域(Domain)是Windows网络中独立运行的单位,域之间相互访问则需要建立信任关系. 当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,还可 ...
- React-Router学习(基础路由与嵌套路由)
示例:基本路由 在这个例子中,我们有3个'Page'组件处理<Router>. 注意:而不是<a href="/">我们使用<Link to=&quo ...
- [loj2477]劈配
考虑依次选择每一位考生,设当前选到第$i+1$位,前i个分别为$p1,p2,--pi$(注意:这里只确定了导师的志愿编号),然后枚举第$p_{i+1}$,通过网络流建图+判定,复杂度为$o(nm*f( ...