openssl处理非阻塞socket

本文介绍了在非阻塞socket环境下,如何处理openssl的SSL_accept、SSL_read和SSL_write。通过循环处理和错误码判断,确保在非阻塞模式下能正确处理SSL连接、读写操作。同时,针对SSL_write过程中遇到的SSL_ERROR_WANT_READ事件,作者提出了疑问并邀请读者探讨。
摘要由CSDN通过智能技术生成

openssl处理非阻塞socket

上篇博文是使用libevent加入ssl功能:
http://blog.csdn.net/fly2010love/article/details/46459485
文中说道,在处理非阻塞socket时需要注意的地方SSL_accept SSL_read SSL_wirte,本篇博文专门介绍如何处理socket在非阻塞下openssl如何处理

有网络程序开发经验的人都知道一个很头疼的问题,那就是在非阻塞的socket下
如果使用事件驱动epoll的ET模式下,在读数据时,若一次没有全部读取,
下次事件将要等到客户端再次发送数据时才会触发,那么这就存在一个问题,
如果客户端不在发送数据了,那么这个链接就废了,本来内核缓冲区还有数据,
并且加上之前读到的数据刚好是一个完整的请求,由于在事件触发时没有一次性
读取完,所以导致了业务处理上检查包的时认为包接收不完整,所以在等待下次
数据接收回调,SSL在非阻塞时同样存在这个问题,并且在accept时也会存在同样的
问题,下面就此问题来进行解决,可能存在一些处理不够完善,欢迎大家吐槽指正

非阻塞socket下SSL_accept处理:
这是上篇博文一样的将socket附加到SSL上的函数,请注意SSL_accept的处理

SSL* CEventBaseMgr::CreateSSL(evutil_socket_t& fd)
{
    if (!CConfiger::GetInstance()->GetEnableSSL())
    {
        return NULL;
    }

    SSL_CTX* ctx = NULL;  
    SSL* ssl = NULL; 
    ctx = SSL_CTX_new (SSLv23_method());
    if( ctx == NULL)
    {
        printf("SSL_CTX_new error!\n");
        return NULL;
    }

    // 要求校验对方证书  
    SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);  

    // 加载CA的证书  
    if(!SSL_CTX_load_verify_locations(ctx, CA_CERT_FILE, NULL))
    {
        SSL_CTX_free(ctx);
        printf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值