AcceptEx和OpenSSL

AcceptEx和OpenSSL,openssl,iocp,Openssl,Iocp,我想知道使用AcceptEx和OpenSSL处理来自客户端的新连接的正确方法。我有一个非常好的工作服务器,它通过常规HTTP使用带有IO完成端口的AcceptEx。我想为它添加OpenSSL支持 我在互联网上读过几篇关于使用OpenSSL和非阻塞套接字的文章: 他们中似乎没有人涉及如何做到这一点,因为他们主要关心连接的客户端。AcceptEx建立套接字连接并返回从客户端发送的第一条数据。我发布的第一个链接讨论了如何使用IOCP处理传入数据。到目前为止,我已经尝试了那里发布的内容,但没

我想知道使用AcceptEx和OpenSSL处理来自客户端的新连接的正确方法。我有一个非常好的工作服务器,它通过常规HTTP使用带有IO完成端口的AcceptEx。我想为它添加OpenSSL支持

我在互联网上读过几篇关于使用OpenSSL和非阻塞套接字的文章:

他们中似乎没有人涉及如何做到这一点,因为他们主要关心连接的客户端。AcceptEx建立套接字连接并返回从客户端发送的第一条数据。我发布的第一个链接讨论了如何使用IOCP处理传入数据。到目前为止,我已经尝试了那里发布的内容,但没有任何运气。我在服务器上看到的基本情况如下:

  • 接收到接受的连接完成
  • 我使用SSL_new(ctx)创建SSL对象
  • 我使用BIO_new(BIO_s_mem())创建输入和输出BIO对象
  • 我通过调用SSL_set_bio(SSL,bioIn,biout)在SSL对象中设置BIOs
  • 我调用SSL_set_accept_state(SSL)来允许SSL_读取和SSL_写入进行协商
  • 然后,我继续尝试处理AcceptEx调用读取的第一个数据缓冲区

  • 我调用BIO_Write(bioIn、buf、len)将读取的数据复制到SSL中
  • 然后,我在bioOut上检查挂起的握手数据,看看是否需要将其发送回客户端。当接受一个新的连接时,我从来没有看到bioOut中有任何数据
  • 然后我调用SSL_read(SSL,plainTextBuf,len)尝试解密我在步骤6中放入bioIn的数据。这总是返回-1,SSL\u get\u error返回error\u SSL\u WANT\u READ。据我所知,这意味着bioIn没有完整的SSL记录,因此SSL需要从客户端获得更多数据,然后才能解密任何内容
  • 这是我开始遇到问题的地方,也是我认为我需要一些方向的地方。我试过很多东西。如果我在这一点上反复调用SSL_read,它将无限返回ERROR_SSL_WANT_read,可能是因为使用内存BIO实际上不会通过套接字进行通信来接收更多数据。我是否应该发布WSARecv呼叫以等待来自客户端的更多数据

    我还尝试在此时使用BIO_read检查bioOut缓冲区,以查看是否有数据需要发送回客户端。确实有一些,我使用WSASend将其发送回,并发布另一个WSARecv调用以等待更多数据(响应我的发送)。这将导致从客户端接收更多数据(WSARecv在发送完成后完成),因此看起来连接正在进行。但是,当我处理这个已完成的读取时,SSL_read和BIO_read都返回ERROR_SSL_WANT_read。所以,我没有足够的数据来解密完整的记录,也没有什么可以发送回客户端。为响应此情况而发布另一个WSARecv调用也不会从客户端收到更多数据。我不知道SSL想要什么


    我现在陷入困境,但我会继续尝试更多的事情。如果我发现了什么,我会用注释更新这个问题。

    您在套接字上发出一个新的重叠读取,等待该操作完成,将数据推送到您的BIO中,并循环执行当前正在执行的步骤

    ERROR\u SSL\u WANT\u READ
    表示BIO需要更多数据,即需要再次读取

    在数据流的任何时候,您可能需要允许SSL层发送或接收更多数据,然后才能将更多应用程序级数据推送到BIO中


    我想我在你提到的那篇文章中已经非常清楚地涵盖了这一切;那篇文章中的代码是我在自己的基于IOCP的服务器中使用的代码的基础…

    我现在都可以使用了,Len。我无法准确地找出我的代码到底出了什么问题,所以我放弃了其中的openssl部分,并通过更密切地跟踪示例代码的结构对其进行了另一次打击。我很感谢你发布这篇文章和示例代码。这很有帮助。