专栏首页Golang语言社区selec/poll中的读写事件和epoll中的读写事件

selec/poll中的读写事件和epoll中的读写事件

在Linux网络编程中,常常使用select和poll来做事件触发,监听socket的读写状态,然后进行读写操作。现在新的linux内核中,增加了epoll事件触发机制,具有更高的性能和更好的设计理念,可以用它来完全代替select和poll。相比于select,epoll最大的好处在于它不会随监听fd数目的增长而降低效率。因为在内核总的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件中有这样的声明:

[cpp] view plain copy

  1. #define __FD_SETSIZE 1024

表示select最多同时监听1024个fd,当然,可以通过修改头文件再重新编译内核来扩大这个数目,但这似乎并不治本。(引自《使用EPOLL进行网络编程》,这篇文章主要是进行一个读写事件的总结,不会过多地讨论epoll,而且本人也是初学)

一、select/poll中的读写事件

1.下列四个条件中的任何一个满足时,套接口准备好多:

a. 有数据可读,专业的说法是:套接字接收缓冲区中的数据字节数大于等于套接字接收缓冲区低潮限度的当前值。可以使用套接字选项SO_RCVLOWAT来设置低潮限度,对于TCP和UDP套接字,其值缺省为1

b. 连接的度这一半关闭,也就是说接收了FIN的TCP连接。对这样的套接字的套接字将不阻塞且返回0(即文件结束符)

c.套接字是一个监听套接字且已完成的连接数为非0,即连接建立后可读

d. 有一个套接字错误待处理。对这样的套接字的读操作将不阻塞且返回一个错误(-1),errno则设置成明确的错误条件。这些待处理的错误也可以通过指定套接口选项SO_ERROR调用getsockopt来取得并清除。

2.下列三个条件中的任一个满足时,套接字准备好写:

a. 缓冲区可写,专业的说法是:套接字发送缓冲区中的可用字节数大于等于套接字发送缓冲区低潮限度的当前值,且或者套接字已连接或者套接字不要求连接(例如UDP套接字),对于TCP和UDP套接字,其缺省值一半为2048

b. 连接的写这一半关闭。对这样的套接字的写操作将产生信号SIGPIPE

c.有一个套接字错误待处理。

二、 epoll的读写事件

EPOLL ET模式下:

读事件的发生条件

1、正常数据到达

2、关闭数据(FIN)到达,即关闭连接

3、连接错误数据(reset)到达

4、连接到到达时(对于监听套接字)

写事件的发生

1、连接建立成功后可写(accept获取的套接字或者客户端建立连接的套接字)

2、缓冲区可写

通过上面的分别阐述,epoll的读写事件区分要比select/poll清晰一些,epoll还有很多优点和细节,在以后的文章中再介绍

本文分享自微信公众号 - Golang语言社区(Golangweb)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-08-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 源目的IP和端口都相同的连接出现的原因

    线上遇到了一个比较特殊的连接,它的源目的IP和端口完全相同,复现的场景是:同一个机器上的两个模块A和B通信,A模块会向B模块的监听套接字发起连接请求,B模块重启...

    李海彬
  • 【Go 语言社区】GO中怎么处理URL编码?

    package main import( "fmt" "net/url") func main(){ var URL = "%5B%7...

    李海彬
  • Golang语言作为服务器,H5作为前端的视频传输

    demo下载地址: http://www.golangweb.com/forum.php?mod=viewthread&tid=2688&from=portal...

    李海彬
  • python编程之网络基础

    1 套接字是一种具有通讯端点概念的计算机网络数据结构,网络化的应用程序在开始任何通讯之前都必须要建立套接字。

    py3study
  • pythonnet-网络编程(1)

    python的网络编程有不少难点,也容易忘记,最近我会陆续发出系统、完整pythonnet知识的博客,一边复习一边分享,感兴趣的可以关注我。

    py3study
  • Python套接字

    Python只支持AF_UNIX(基于文件)、AF_NETLINK(使用标准的BSD套接字接口进行用户级别和内核级别代码之间的IPC)、AF_TIPC(透明的进...

    用户4845306
  • 套接字

    版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.ne...

    zy010101
  • 进程间通信的历史与未来

    - START - 我们都知道线程是共享内存空间的,因此不会发生所谓的通信,而进程则存在如何防止多进程同时访问数据的排他控制问题。 5 种进程间通信的方式 ? ...

    临书
  • unix网络编程——TCP套接字编程

      TCP客户端和服务端所需的基本套接字。服务器先启动,之后的某个时刻客户端启动并试图连接到服务器。之后客户端向服务器发送请求,服务器处理请求,并给客户端一个响...

    Mister24
  • Linux C Socket Api详解

    以前都只是在网上搜的能用的例子,对一些参数不是很清楚,这次汇总。而且网络通信还是很常用的通信手段。

    用户5908113

扫码关注云+社区

领取腾讯云代金券