相关知识点简介: epoll有两个模式可以设置,一个是水平模式(level-triggered),另一个是边缘模式(edge-triggered), 区别就是水平模式可以带来事件的重复触发,而边缘模式只触发一次。举个栗子,当epoll监听的描述符发生可读事件时,比方说收到了别人发来的10个字节数据,你只读了一个字节,如果是水平触发,那么epoll将一直触发直到剩下那9个字节读完,而边缘触发呢,就是收到了一个读事件,你自己去读吧,读多少算多少,而epolll只触发一次。

而我在实际测试epoll监听udp套接字的时候,使用默认的水平触发去监听读事件,每次只读取一个字节,按道理收到多个字节epoll应该触发(trigger)多次才对,结果它只触发了一次,如图:

程序启动后监听3500端口,使用网络调试助手发3个字节到监听地址,只读取一个,结果显示epoll触发一次后就hang住

代码这样写的:

    while(1) {fds = epoll_wait(efd, epoll_events_ptr, 2, -1); //阻塞for (i = 0; i<fds; i++){    if (epoll_events_ptr[i].events & EPOLLIN){   ret = read(fd1, buffer, 1);if(ret != -1)log("recv msg : %s \n", buffer);}     memset(buffer, 0, BUFFER_SIZE);}        }   

同样情况下,如果监听的是标准输入的话,epoll触发了多次,如下图,代码就不贴了

两个例子流程基本一样,除了一个监听udp套接字,一个监听标准输入(STDIN_FILENO)

最后在stackoverflow上有大神解答说UDP套接字是以报文为单位的,如果一次没有读取完成,剩余数据会被丢弃,这解释了为什么epoll只触发了一次,因为在读取一个字节的时候,剩余两个字节被丢弃了。这和面向字节流的TCP套接字不同。

stackoverflow上的问题链接:

https://stackoverflow.com/questions/50938689/epoll-eventsepolllt-only-triggered-once-on-udp-socket/50939267#50939267

创建了一个linux应用&内核相关开发到讨论群:745510310 欢迎有兴趣的同学加入

关于epoll 水平触发在udp套接字上不生效问题的原因相关推荐

  1. 【Linux网络编程】UDP 套接字编程

    [Linux网络编程]UDP 套接字编程 [1]用户数据报协议(UDP) UDP是一个简单的传输层协议,不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数 ...

  2. 《网络编程》基本 UDP 套接字编程

    在前面文章中介绍了<UDP 协议>和<套接字数据传输>.UDP 协议和 TCP 协议不同,它是一种面向无连接.不可靠的传输层协议.在基于 UDP 套接字编程中,数据传输可用函数 ...

  3. 基本UDP套接字编程

    使用UDP编写的一些常见的应用程序有:DNS(域名系统),NFS(网络文件系统)和SNMP(简单网络管理协议) UDP客户/服务器交互中发生的典型情形的时间线图. recvfrom和sendto函数 ...

  4. 计算机网络实验二:UDP套接字编程实现多人聊天

    一.实验目的 1. 实现一个能够在局域网中进行点对点聊天的实用程序. 2. 熟悉c++.Java等高级编程语言网络编程的基本操作. 3. 基本了解对话框应用程序的编写过程. 4. 实现UDP套接字编程 ...

  5. 使用DatagramSocket发送、接收数据(Socket之UDP套接字)

    2019独角兽企业重金招聘Python工程师标准>>> 创建一个DatagramSocket实例,并将该对象绑定到指定IP地址.指定端口. 通过上面三个构造器中的任意一个构造器即可创 ...

  6. tcp/ip 协议栈Linux内核源码分析15 udp套接字接收流程二

    内核版本:3.4.39 上篇我们分析了UDP套接字如何接收数据的流程,最终它是在内核套接字的接收队列里取出报文,剩下的问题就是谁会去写入这个队列,当然,这部分工作由内核来完成,本篇剩下的文章主要分析内 ...

  7. tcp/ip 协议栈Linux内核源码分析14 udp套接字接收流程一

    内核版本:3.4.39 前面两篇文章分析了UDP套接字从应用层发送数据到内核层的处理流程,这里继续分析相反的流程,看看数据是怎么从内核送到应用层的. 与发送类似,内核也提供了多个接收数据的系统调用接口 ...

  8. tcp/ip 协议栈Linux内核源码分析13 udp套接字发送流程二

    内核版本:3.4.39 继续UDP套接字发送,上一篇讲到了sock_sendmsg,这里继续,下面是sock_sendmsg的相关代码 int sock_sendmsg(struct socket * ...

  9. tcp/ip 协议栈Linux内核源码分析12 udp套接字发送流程一

    内核版本:3.4.39 因为过往的开发工作中既包括内核网络层模块的开发,又包括应用层程序的开发,所以对于网络数据的通信有那么一些了解.但是对于网络通信过程中,内核和应用层之间接口是如何运作的不是很清楚 ...

最新文章

  1. 51个国家,2372名选手,20万奖金池,阿里全球调度算法大赛收官
  2. ffmpeg 转码_小水谈转码---FFmpeg安装
  3. [Luogu1891]疯狂LCM[辗转相减法]
  4. JVM(六)为什么新生代有两个Survivor分区? 1
  5. php图片长宽处理,用php调整图片宽高 | 学步园
  6. ‘packaging‘ with value ‘jar‘ is invalid. Aggregator projects require ‘pom‘ as packaging.
  7. opensource项目_Opensource.com 3月预览
  8. linux安装redis清除错误,关于linux redis安装及安装遇到的问题
  9. 融资13亿后突然死亡!首款产品被苹果点赞,与谷歌竞赛的明星创业公司Anki倒闭...
  10. oracle安装后再建库,oracle-数据库的安装与建库
  11. 内网穿透工具--NPS
  12. js监听移动端手机横竖屏事件
  13. C_sharp-gives-OJ-background-test-data
  14. 群英服务器网站,群英网
  15. 流量池是什么?有什么作用?
  16. ⑮霍兰德EA*型如何选专业?高考志愿填报选专业
  17. 如何解决百度云下载慢的问题
  18. 图算法:2、计算带有负权值的单源最短路径:Bellman-Ford算法
  19. mysql判断日期是不是月末_java 判断一个日期是不是月末
  20. 广东计算机软件证书继续教育问题,2019年广东省专业技术人员继续教育系统个人操作常见问题解答...

热门文章

  1. 《Data-Intensive Text Processing with mapReduce》读书笔记之一:前言
  2. WebService(1)名词了解
  3. html图片重叠在一排,【CSS】使用浮动进行图片排列却不能使图片在同一行
  4. 6.2 K-Means 算法步骤-机器学习笔记-斯坦福吴恩达教授
  5. 彻底弄懂ICG的基本概念
  6. 【测试】ESP32天线信号强度比较,小龟小车A2天线esp32cam板载外置天线测试数据...
  7. 备考一天速通计算机三级网络技术
  8. 雷达篇(八)合成孔径雷达工作模式
  9. 基于随机接入代价的异构网络速率分配算法研究
  10. C++使用默认参数的构造函数