首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

具有边缘触发的非阻塞epoll的SSL_accept总是返回SSL_ERROR_WANT_READ

SSL_accept是OpenSSL库中的一个函数,用于在SSL/TLS握手过程中接受客户端的连接请求。在使用非阻塞模式下,当SSL_accept函数被调用时,如果没有足够的数据可供读取,它将返回SSL_ERROR_WANT_READ错误码。

边缘触发是一种I/O模型,它只在底层数据流的状态发生变化时通知应用程序,而不管应用程序是否准备好处理数据。非阻塞模式下的epoll是Linux提供的一种高效的I/O事件通知机制。

综上所述,具有边缘触发的非阻塞epoll的SSL_accept函数在以下情况下会返回SSL_ERROR_WANT_READ错误码:

  1. 当前没有足够的数据可供读取,需要等待更多数据到达。
  2. 底层数据流的状态发生变化,需要重新调用SSL_accept函数以完成握手过程。

SSL_accept函数的返回值可以用于判断握手过程的状态,根据返回值的不同可以采取相应的处理逻辑。在处理SSL_accept返回SSL_ERROR_WANT_READ错误码时,可以继续监听读事件,等待更多数据到达后再次调用SSL_accept函数。

腾讯云提供了一系列与SSL/TLS相关的产品和服务,包括SSL证书、SSL加速、SSL VPN等。您可以访问腾讯云官网了解更多详细信息和产品介绍:

  • SSL证书:提供了多种类型的SSL证书,用于保护网站和应用程序的安全通信。详情请参考:SSL证书 - 腾讯云
  • SSL加速:通过CDN加速和全球节点部署,提供快速、安全的SSL加速服务。详情请参考:SSL加速 - 腾讯云
  • SSL VPN:提供安全的远程访问解决方案,保护企业内部网络的安全通信。详情请参考:SSL VPN - 腾讯云

请注意,以上仅为示例,具体的产品选择应根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

https大势已来?看腾讯专家如何在高并发压测中支持https

要点2:OpenSSL建链、收包、发包接口,其是否阻塞都随socket本身属性而变,所以OpenSSL可以阻塞使用 在我们场景下,用epoll来维护机器人并发建连接和收发包,当然希望任何一个动作都是非阻塞...这样,如果socket本身设置为阻塞,那这个操作也就不会阻塞,而是有三种返回可能: ? 1)返回0: 意味着ssl层交互阻塞了。...此时,用SSL_get_error()可以获取具体错误码:若是SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE,就在epoll中关注该连接可读或可写事件,并在事件被触发时接着调用...上面的第2点就是openSSL比较奇葩一个地方了:调用SSL_write发包,可能返回是一个SSL_ERROR_WANT_READ,即发包可能阻塞在读操作!无法理解吧。...可能刚好在recv协议数据时被阻塞了,那就只能乖乖地等socket可读了——SSL_write在这种情况下,会返回一个SSL_ERROR_WANT_READ,等待可读。

1.2K30

IO模型

阻塞阻塞,是函数/方法实现方式,即在数据就绪之前是立刻返回还是等待,即发起IO请求是否会被阻塞。 以文件IO为例,一个IO读过程是文件数据从磁盘→内核缓冲区→用户内存过程。...select和poll原理基本相同: 注册待侦听fd(这里fd创建时最好使用阻塞) 每次调用都去检查这些fd状态,当有一个或者多个fd就绪时候返回 返回结果中包括已就绪和未就绪fd 相比select...此外,对于IO复用还有一个水平触发边缘触发概念: 水平触发:当就绪fd未被用户进程处理后,下一次查询依旧会返回,这是select和poll触发方式。...边缘触发:无论就绪fd是否被处理,下一次不再返回。理论上性能更高,但是实现相当复杂,并且任何意外丢失事件都会造成请求处理错误。epoll默认使用水平触发,通过相应选项可以使用边缘触发。...此种io方式存在一个很大问题:Linux中信号队列是有限制,如果超过这个数字问题就无法读取数据。 异步阻塞 之前就餐方式,到最后总是需要你自己去把饭菜端到餐桌。

55520
  • 关于IO模型,和select、poll、epoll区别

    I/O模型主要包括:阻塞IO、阻塞IO、I/O 多路复用、异步I/O和信号I/O; Socket创建时候默认是阻塞,如何将Socket设置为阻塞?...常用I/O复用函数有select、poll和epoll;但I/O复用函数本身是阻塞,它们能提高程序效率原因在于它们具有同时监听多个I/O事件能力; SIGIO信号,即信号驱动IO,也可以用来报告...I/O事件,但某个目标文件描述符上有事件发生时,SIGIO信号信号处理函数就将被触发,我们也就可以在该信号处理函数中对目标文件描述符执行阻塞I/O操作了。...:epoll为什么只能使用阻塞Socket?...epoll 对文件描述符操作有两种模式:LT(水平触发 level trigger) 和 ET(边缘触发 edge trigger)。

    36720

    图文详解 epoll 原理【Redis,Netty,Nginx实现高性能IO核心原理】epoll 详解

    模型 我们在进行编程开发时候,经常会涉及到同步,异步,阻塞阻塞,IO多路复用等概念,这里简单总结一下。...之所以会有同步、异步、阻塞阻塞这几种说法就是根据程序在这两个阶段处理方式不同而产生。 事件 可读事件,当文件描述符关联内核读缓冲区可读,则触发可读事件。...参数timeout描述在函数调用中阻塞时间上限,单位是ms: timeout = -1表示调用将一直阻塞,直到有文件描述符进入ready状态或者捕获到信号才返回;timeout = 0用于阻塞检测是否有描述符处于...epoll支持边缘触发(edge trigger,ET)或水平触发(level trigger,LT),通过epoll_wait等待I/O事件,如果当前没有可用事件则阻塞调用线程。...采用边沿触发 JDK并没有实现边缘触发,Netty重新实现了epoll机制,采用边缘触发方式;另外像Nginx也采用边缘触发

    10.1K104

    聊聊同步与异步、阻塞阻塞、IO模型

    )被调用者通过状态、通知或回调机制主动通知调用者被调用者运行状态 阻塞/阻塞 阻塞/阻塞:关注调用者在等待结果返回之前所处状态 阻塞:(blocking),指IO操作需要彻底完成后才返回到用户空间...,调用结果返回之前,调用者被挂起 阻塞:(nonblocking)指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成,最终调用结果返回之前,调用者不会被挂起 I/O模型 五种/O模型...同步体现在:等待下载完成通知; 阻塞体现在:等待下载完成通知过程中,不能做其他任务处理; 2. 阻塞型 ? 同步阻塞IO模型 描述: 用户线程发起IO请求时立即返回。...,System V unix最早实现 Epoll:Linux实现,对应I/O复用模型,具有信号驱动I/O模型某些特性(nginx) Kqueue:FreeBSD实现,对应I/O复用模型,具有信号驱动I...fd 边缘触发:只通知一次 ---- epoll:在Linux 2.6内核中提出select和poll增强版本 支持水平触发LT和边缘触发ET,最大特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态

    1.1K10

    day02 真正高并发还得看IO多路复用

    // EPOLLET:边缘触发(后面细讲) epfd: epoll_create创建epoll_fd op: 要操作类型: a....,表示不超时,如果设置为0,即使没有IO事件也会立即返回 epoll有EPOLLLT(水平触发)和EPOLLET(边缘触发)两种工作模式: 水平触发:只要socket处于可读状态(缓冲区有数据)或可写状态...边缘触发:只有套接字状态由不可写到可写或由不可读到可读时,才会触发epoll_wait返回。...边缘触发处理起来会比水平触发比较麻烦,但性能会比水平触发高,因为减少 epoll 相关系统调用次数 讲完epoll使用方法,我们把前面的伪代码套上epoll边缘触发模式,完整代码如下: #include...使用阻塞IO处理方式:我们只要循环read,直到读完全部数据即可(read返回0)。

    1K132

    万字图解| 深入揭秘IO多路复用

    epoll边缘触发、水平触发区别、适合场景 为什么在 Linux 网络编程中最好用阻塞式 IO?...epoll边缘触发与水平触发 水平触发(LT) 关注点是数据,只要读缓冲区不为空,写缓冲区不满,那么epoll_wait就会一直返回就绪,水平触发epoll默认工作方式。...边缘触发(ET)     关注点是变化,只要缓冲区数据有变化,epoll_wait就会返回就绪。     ...假设epoll被设置为了边缘触发,当客户端写入了10个字符,由于缓冲区从0变为了10,于是服务端epoll_wait触发一次就绪,服务端读取了2个字节后不再读取。...3、select、poll、epoll只是返回了可读事件,并没有返回可读数据量。因此,使用阻塞 IO一般做法是读多次,直到不能读为止。

    2.7K23

    架构师玄学之路-IO模型

    阻塞阻塞是从函数调用角度来说,而同步和异步是从"读写是谁完成"角度来说 阻塞:如果读写没有就绪或者读写没有完成,则该函数一直等待。...阻塞:函数立即返回,然后让应用程序轮询、 同步:读写游应用程序完成 异步:读写由操作系统完成,完成之后,回调或者事件通知应用程序 异步I/O一定是非阻塞I/O,不存在既是异步I/O,又是阻塞;同步I...I/O多路复用(select、poll、epoll)都是同步I/O,因为read和write函数操作都是应用程序完成,同时也是阻塞I/O,因为select、read、write调用都是阻塞。...asio库就是典型Proactor模式 epollLT和ET模式 epoll支持两种模式:LT(水平触发)和ET(边缘触发)。水平触发又称为条件触发边缘触发又称为状态触发。...水平触发:读缓冲区只要不为空,就会一直触发读事件;写缓冲区只要不满,就会一直触发写事件。 边缘触发:读缓冲区状态,从空转为时候触发一次;写缓冲区状态,从满转为时候粗发一次。

    56540

    Linux下几种并发服务器实现模式(详解)

    之后有的epoll,实用方法是:用一个线程专门进行端口监听,accept接收到连接时候,把连接设置成阻塞方式,把epoll时间设置成边缘触发方式,加入epoll管理。...接收线程阻塞epoll等待事件函数。另外一个线程专门用于数据发送。 注意: 1.如果把epoll设置成水平触发效率就下降采用select水平。...epoll时间设置有边缘触发方式和水平触发方式 1.水平触发方式: 如果文件描述符已经就绪可以阻塞执行IO操作了,此时会触发通知。...eg:现在有一个1000个字节报文,无论是水平触发还是边缘触发,都会发送一个只读通知,当收到了100个字节后,水平触发因为还有字节没有读完,就会发送一个只读通知,但是边缘触发会一直保持等待通知,等待接下来报文到来...,直到边缘触发返回EWOULDBLOCK就摒弃这个socket。

    90521

    彻底搞懂epoll高效运行原理

    事件 可读事件,当文件描述符关联内核读缓冲区可读,则触发可读事件。(可读:内核缓冲区空,有数据可以读取) 可写事件,当文件描述符关联内核写缓冲区可写,则触发可写事件。...参数timeout描述在函数调用中阻塞时间上限,单位是ms: timeout = -1表示调用将一直阻塞,直到有文件描述符进入ready状态或者捕获到信号才返回; timeout = 0用于阻塞检测是否有描述符处于...epoll支持边缘触发(edge trigger,ET)或水平触发(level trigger,LT),通过epoll_wait等待I/O事件,如果当前没有可用事件则阻塞调用线程。...JDK并没有实现边缘触发,Netty重新实现了epoll机制,采用边缘触发方式;另外像Nginx也采用边缘触发。...JDK在Linux已经默认使用epoll方式,但是JDKepoll采用是水平触发,而Netty重新实现了epoll机制,采用边缘触发方式,netty epoll transport 暴露了更多nio

    1.8K32

    一文读懂五大 IO 模型前世今生( select、epollepoll

    真正实现阻塞式 IO 我们应该让操作系统提供一个阻塞 read() 函数,当第一阶段读未就绪时返回 -1 ,当读已就绪时才进行数据读取。...// 处理数据 close(connfd); // 关闭连接 }边缘触发和水平触发select/poll 只有水平触发模式,epoll 支持两种事件触发模式,分别是边缘触发(edge-triggered...,ET)和水平触发(level-triggered,LT),epoll 默认触发模式是水平触发。...边缘触发使用边缘触发模式时,当被监控 Socket 描述符上有可读事件发生时,服务器端只会从 epoll_wait 中苏醒一次,即使进程没有调用 read 函数从内核读取数据,也依然只苏醒一次,因此我们程序要保证一次性将内核缓冲区数据读取完...,因此我们在一个线程内通过 while 和阻塞 read 能力避免等待读就绪过程中线程资源占用,后来操作系统发现这个场景比较多,便提供了 select、epollepoll 函数实现上述功能来减少系统调用

    86641

    网络通信基础重难点解析 12 :Linux epoll 模型

    LT 模式和 ET 模式 与 poll 事件宏相比,epoll 新增了一个事件宏 EPOLLET,这就是所谓边缘触发模式(Edge Trigger,ET),而默认模式我们称为 水平触发模式(Level...这两种模式区别在于: 对于水平触发模式,一个事件只要有,就会一直触发; 对于边缘触发模式,只有一个事件从无到有才会触发。...那么水平模式触发条件是状态处于高电平,而边缘模式是状态改为高电平,即: 水平模式触发条件 1. 低电平 => 高电平 2. 高电平 => 高电平 边缘模式触发条件 1....可写事件边缘模式触发条件: 1. socket不可写 => socket可写 也就是说,如果对于一个阻塞 socket,如果使用 epoll 边缘模式去检测数据是否可读,触发可读事件以后,一定要一次性把...std::cout << "create listen socket error." << std::endl; return -1; } //将侦听socket设置为阻塞

    1.5K31

    多路IO—POll函数,epoll服务器开发流程

    , 具体是: 数组下标的最大值+1 timeout: =0: 不阻塞, 立刻返回 -1: 表示一直阻塞, 直到有事件发生 >0: 表示阻塞时长, 在时长范围内若有事件发生会立刻返回; 如果超过了时长也会立刻返回...                  EPOLLERR: 错误事件               EPOLLET: 边缘触发模式 event.fd: 要监控事件对应文件描述符 typedef...,并且发送数据,需要将socket设置为阻塞模式 ET设置了阻塞模式是因为使用了边缘触发模式(EPOLLET)。...在边缘触发模式下,当有数据可读时,只会触发一次EPOLLIN事件,如果该次读取没有将缓冲区中数据全部读取完毕,下次还是会触发EPOLLIN事件。...因此,为了保证每次读取完整数据,需要将socket设置为阻塞模式,避免在缓冲区没有全部读取完毕时进行阻塞

    27840

    C++网络库都干了什么?

    我们现在把刚才说过程总结一下,首先需要把 socket 设置阻塞,然后不同平台上将事件通知到不同事件触发模型上,监测到事件时,回调通知给上层。...这又设计到 epoll 两种触发模式,水平触发边缘触发。...水平触发边缘触发效率要低一些,在 epoll 内部实现上,用了两个数据结构,用红黑树来管理监测 socket,每个节点上对应存放着 socket handle 和触发回调函数指针。...边缘触发模式时,每次 epoll_wait 时只需要将活动事件链表取出即可,但是水平触发模式时,还需要将数据未全部读取 socket 再次放置到链表中。 CppNet 采用边缘触发模式。...等待意味着阻塞,前边已经提到了,我们用到 socket 已经全部设置为阻塞模式了,你调用了 accept,也不会乖乖阻塞在哪里了,而是迅速返回,有没有连接到来,还得接着判断。

    2.2K50

    c++ 网络编程(八)TCPIP LINUX-epollwindows-IOCP下 socket opoll函数用法 优于select方法epoll 以及windows下IOCP 解决多

    maxevents 每次能处理事件数 * @param timeout 等待I/O事件发生超时值;-1相当于阻塞,0相当于阻塞。...边缘触发相对条件触发优点:可以分离接收数据和处理数据时间点,从实现模型角度看,边缘触发更有可能带来高性能。...将上面epoll实例改为边缘触发: 1,首先改写 event.events = EPOLLIN | EPOLLET; (EPOLLIN:读取数据事件 EPOLLET:边缘触发方式) 2,边缘触发只响应一次接收数据事件....); if(str_len < 0) { if(errno == EAGAIN) //读取输入缓冲中全部数据标志 break; } 3,边缘触发方式下,以阻塞方式工作read...所以边缘触发一定要采用阻塞套接字数据传输形式。那么怎么将套接字read,write数据传输形式修改为阻塞模式呢?

    2.2K40

    多路IO复用模型 select epoll

    同步阻塞IO在等待数据就绪上花去太多时间,而传统同步阻塞IO虽然不会阻塞进程,但是结合轮询来判断运维...强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码 同步阻塞IO在等待数据就绪上花去太多时间,而传统同步阻塞IO虽然不会阻塞进程,但是结合轮询来判断数据是否就绪仍然会耗费大量...kqueue FreeBSD实现了kqueue,可以支持水平触发边缘触发,性能和下面要提到epoll非常接近。...Nginx就使用了epoll边缘触发模型。 这里提一下水平触发边缘触发就绪通知区别,这两个词来源于计算机硬件设计。...因此在使用边缘触发 api 时,要注意每次都要读到 socket返回 EWOULDBLOCK为止 ===================================================

    59421

    Linux内核编程--常见IO模型与selectpollepoll编程

    2.阻塞式I/O 阻塞模式和阻塞模式区别在于,阻塞模式没有收到数据报返回时候会一直阻塞等待,直到数据报到达或者报错产生,而非阻塞模式是不断地检查数据报到达状态,有数据报到达就返回数据报,没有数据报到达或发生错误就报错返回...设置为边缘触发模式 EPOLLONESHOT:只监听一次事件 --epfd参数: 含义:由epoll_create创建epoll实例 --fd参数: 含义:需要被监听文件描述符 --event...如果timeout=-1,则会一直阻塞,如果timeout=0,则函数为阻塞模式,会立即返回。 *使用完epoll后,必须调用close函数关闭描述符。...两者区别:边缘触发效率更高,减少了事件被重复触发次数,边缘触发时不会返回大量用户程序不需要文件描述符。...对于epoll实现服务器: 使用边缘触发模式时,当被监听套接字描述符上有可读事件发生时,服务器进程只会在 epoll_wait 中被通知一次,即使用户进程没有从内核读取数据或者没有把内核中数据一次性读取完

    1.2K30

    C++ socket epoll初识

    实例中发生, 并返回事件以及对应文件描述符l 2.2 UnixIO模型 我们在进行编程开发时候,经常会涉及到同步,异步,阻塞阻塞,IO多路复用等概念,这里简单总结一下。...之所以会有同步、异步、阻塞阻塞这几种说法就是根据程序在这两个阶段处理方式不同而产生。 2.3 事件 2.3.1 可读与可写 可读事件,当文件描述符关联内核读缓冲区可读,则触发可读事件。...); 阻塞等待注册事件发生,返回事件数目,并将触发事件写入events数组中。...参数timeout描述在函数调用中阻塞时间上限,单位是ms: timeout = -1表示调用将一直阻塞,直到有文件描述符进入ready状态或者捕获到信号才返回;timeout = 0用于阻塞检测是否有描述符处于...epoll支持边缘触发(edge trigger,ET)或水平触发(level trigger,LT),通过epoll_wait等待I/O事件,如果当前没有可用事件则阻塞调用线程。

    87052

    socket阻塞阻塞,同步与异步IO模型

    例如 ajax请求(异步): 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕 阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入可执行状态,在这个状态下,...阻塞 阻塞阻塞概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。...阻塞IO和阻塞IO区别就在于:应用程序调用是否立即返回!...因此,阻塞套接字便显得有些难于使用。     但是,阻塞套接字在控制建立多个连接,在数据收发量不均,时间不定时,明显具有优势。...epoll: epoll支持水平触发边缘触发,最大特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次。

    3.1K10

    unix网络编程——IO多路复用之epoll

    基本概念   当程序进行IO时,如果数据尚未准备好,那么IO将处于阻塞状态。当某个进程有多个打开文件,比如socket,那么其后所有准备好读写文件将受到阻塞影响而不能操作。...EPOLLET: 将EPOLL设置为边缘触发(Edge Triggered)模式;   6....该函数返回需要处理事件数目,如返回0表示已超时。...3.epoll工作模式   epoll对文件描述符操作有两种模式:LT(level trigger,水平触发)和ET(edge trigger,边缘触发)。 LT模式:水平触发是缺省工作方式。...epoll工作在ET模式时候,必须使用阻塞套接口,以避免由于一个文件句柄阻塞读/阻塞写操作把处理多个文件描述符任务饿死。

    65220

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券