当socket设置成非阻塞时,并且将EPOLLOUT事件通过epoll_ctl添加时,可写事件总是会触发,可以通过写代码来验证

代码如下:

#include <sys/socket.h>
#include <sys/epoll.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>#define SERV_PORT  10000
#define MAX_EVENTS 10
#define LEN 2int main(int argc, char **argv)
{if (argc != 2) {perror("usage:exe port\n");return -1;}struct sockaddr_in servaddr;int sockfd;memset(&servaddr, 0x00, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(atoi(argv[1]));servaddr.sin_addr.s_addr = htonl(INADDR_ANY);sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket error");exit(-1);}if (bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) {perror("bind error");close(sockfd);exit(-1);}if (listen(sockfd, 3) == -1) {perror("listen error");close(sockfd);exit(-1);}int epollfd = epoll_create(MAX_EVENTS);if (epollfd == -1) {perror("epoll_create error");close(sockfd);exit(-1);}struct epoll_event ev, events[MAX_EVENTS];ev.events = EPOLLIN;ev.data.fd = sockfd;if (epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, &ev) == -1) {perror("epoll_ctl error");exit(-1);}int nfds, connfd;for (;;) {nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);if (nfds == -1) {perror("epoll_wait error");exit(-1);}int i;        for (i = 0; i < nfds; i++) {if (events[i].data.fd == sockfd) {connfd = accept(sockfd, NULL, NULL);printf("connfd=%d\n", connfd);if (connfd == -1) {perror("accept error");exit(-1);}    int flag;flag = fcntl(connfd, F_GETFL, 0);fcntl(connfd, F_SETFL, flag & ~O_NONBLOCK);          ev.events = EPOLLOUT;ev.data.fd = connfd;if (epoll_ctl(epollfd, EPOLL_CTL_ADD, connfd, &ev) == -1) {perror("epoll_ctl error");exit(-1);}} else {/*char buf[LEN];int n = read(events[i].data.fd, buf, LEN);buf[n] = 0;printf("buf=%s\n", buf);*/if (events[i].events & EPOLLOUT) {printf("fd=%d\n", events[i].data.fd);}}}}
}

当监听到有连接到来时,接收连接,并且将连接设置成非阻塞,添加EPOLLOUT事件,这时会一直打印fd=5

输出为

可以像libevent那样,当有数据要写时,才将描述符fd添加进去,数据写完之后,再将fd删除

对于非阻塞socket的可写事件相关推荐

  1. 使用select+非阻塞socket写的网络数据转发程序 « Xiaoxia[PG]

    使用select+非阻塞socket写的网络数据转发程序 « Xiaoxia[PG] 使用select+非阻塞socket写的网络数据转发程序 « Xiaoxia[PG] 从实践之中,我又学到东西了! ...

  2. linux socket 阻塞服务端 非阻塞客户端,linux下异步RPC的阶段性总结-非阻塞SOCKET客户端...

    尽可能使用非阻塞socket int flags, s; flags = fcntl (fd, F_GETFL, 0); if (flags == -1){ close(fd); return -1; ...

  3. 深入理解阻塞socket和非阻塞socket

    什么是阻塞socket,什么是非阻塞socket.对于这个问题,我们要先弄清什么是阻塞/非阻塞.阻塞与非阻塞是对一个文件描述符指定的文件或设备的两种工作方式. 阻塞的意思是指,当试图对该文件描述符进行 ...

  4. linux 非阻塞 socket - Google 搜索

    linux 非阻塞 socket - Google 搜索 linux c实现超时.非阻塞socket的函数select - Yunlu Liu (刘云璐) sites.google.com/site/ ...

  5. 使用NIO实现异步非阻塞Socket tcp通信

    使用NIO实现异步非阻塞Socket tcp通信 一.BIO与NIO IO(BIO)和NIO区别:其本质就是阻塞和非阻塞的区别 阻塞概念:应用程序在获取网络数据的时候,如果网络传输数据很慢,就会一直等 ...

  6. python select實現非阻塞socket

    python select實現非阻塞socket - liukeforever的专栏 - 博客频道 - CSDN.NET python select實現非阻塞socket 分类: Python 201 ...

  7. 非阻塞socket的连接

    引用自:http://blog.csdn.net/cccallen/article/details/6619994 连接套接字,阻塞的套接字超时时间很长无法接受,而是用非阻塞套接字时使用的方案也有多种 ...

  8. 从缓冲上看阻塞与非阻塞socket在发送接收上的区别

    最近在网络上看到一些帖子以及回复,同时又搜索了一些网络上关于阻塞非阻塞区别的描述,发现很多人在描述两者的发送接收时操作返回以及缓冲区处理的区别时有不同程度的误解.所以我想写一篇文章来纠正错误,并作为记 ...

  9. socket编程 —— 非阻塞socket (转)---例子已上传至文件中

    在上一篇文章 <socket编程--一个简单的例子> http://blog.csdn.net/wind19/archive/2011/01/21/6156339.aspx 中写了一个简单 ...

最新文章

  1. Design Pattern Strategy C
  2. java udp 服务器_Java UDP 服务器与客户端的问题
  3. php ahp和jhp,php7.4编译(centos)
  4. CString 操作函数
  5. 持续提高 Android 应用的安全性与性能
  6. java保存文件到linux指定目录_怎么使用java编程实现linux下全部文件目录的遍历
  7. sql三表查询_SQL第五关:多表查询
  8. neatdm路径_扫地机还能这么玩 延时摄影看路径规划
  9. Golang Go语言 安装包 下载 官方包 与 Golang 中文网
  10. 信度spss怎么做_实用干货!信度分析超全步骤总结!
  11. Kiwi for Gmail Mac(mac gmail邮箱客户端)
  12. 如何将win7电脑变身WIFI热点,让手机、笔记本共享上网?
  13. 2017第48周日昨天休息
  14. iOS项目开发中的知识点与问题收集整理
  15. 空间和时间 ----节选《时间简史》 霍金
  16. 区块链十年一梦:有人辞官归故里,有人星夜来赶考
  17. idea如何做到多模块开发项目
  18. 卸载mysql5.6.34_5.6.34版本安装后需要做的事项\mysql\.\innodb_table_stats\ not found.-hxl-ChinaUnix博客...
  19. Google Earth Engine 教程——栅格矢量数据转化和导出
  20. Social Network之缘分

热门文章

  1. 【转】Silverlight全开源工作流设计器
  2. NoSql数据库使用半年后在设计上面的一些心得
  3. 微软图表控件MsChart使用说明[转]
  4. jmeter中文_JMeter安装配置
  5. 学会python能找工作吗-Python学到什么程度才可以去找工作?掌握这4点足够了!...
  6. python在中小学教学中的应用-Python编程已经走进中小学课堂
  7. winpython使用教程-Win系统PyQt5安装和使用教程
  8. python与excel结合-Python与Excel 不得不说的事情
  9. python流程控制-Python流程控制常用工具详解
  10. python 自动化-Python API 自动化实战详解(纯代码)