OpenSSL上的Windows选择API 我有一个要求,我的服务器(使用OpenSSL的Windows C++)将听客户的“N”个数,并根据客户机请求异步响应。为此,我计划使用selectapi调用。但OpenSSL似乎不适用于SELECTAPI调用。所以我想知道是否还有其他方法可以实现这个功能

OpenSSL上的Windows选择API 我有一个要求,我的服务器(使用OpenSSL的Windows C++)将听客户的“N”个数,并根据客户机请求异步响应。为此,我计划使用selectapi调用。但OpenSSL似乎不适用于SELECTAPI调用。所以我想知道是否还有其他方法可以实现这个功能,windows,select,openssl,Windows,Select,Openssl,非常感谢您在这方面提供的任何帮助。OpenSSL与select()配合使用,但诀窍在于知道何时使用select()。例如,在读取数据时,传统的非阻塞套接字逻辑是先调用select(),然后在select()表示有数据要读取时调用recv()。这不适用于传统的OpenSSL API!您需要先调用ssl\u read(),然后调用select()以等待可读性,只有当ssl\u read()报告ssl\u ERROR\u WANT\u read错误时。换句话说,这是等待准备就绪然后采取行动与采取行动然

非常感谢您在这方面提供的任何帮助。

OpenSSL与
select()
配合使用,但诀窍在于知道何时使用
select()
。例如,在读取数据时,传统的非阻塞套接字逻辑是先调用
select()
,然后在
select()
表示有数据要读取时调用
recv()
。这不适用于传统的OpenSSL API!您需要先调用
ssl\u read()
,然后调用
select()
以等待可读性,只有当
ssl\u read()
报告
ssl\u ERROR\u WANT\u read
错误时。换句话说,这是等待准备就绪然后采取行动采取行动然后等待就绪之间的区别。而且有可能
ssl\u read()
会报告
ssl\u错误\u WANT\u WRITE
错误,在这种情况下,您必须调用
select()
来检查可写性。是的,读操作可以触发写操作

对于
ssl\u send()
ssl\u ERROR\u WANT\u WRITE
进行写入,以及
ssl\u ERROR\u WANT\u READ
进行读取,都需要类似的考虑。是的,写操作可以触发读操作

您真的无法在现有的非SSL套接字实现之上移植传统的OpenSSL,至少不需要额外的工作。这是可以做到的(我已经做到了),但并不容易。传统的OpenSSL有其自己的逻辑,几乎落后于传统的套接字逻辑

如果您有一个现有的套接字实现,并且只想在其中添加SSL/TLS,而不需要太多麻烦,那么您有两个选择:

  • 改用OpenSSL的BIOAPI。创建两个内存BIO对,一个用于输入,一个用于输出

  • 切换到Microsoft的Crypto/SChannel API(或其他支持推送模型的第三方库)

  • 这两种方法都允许您使用自己的套接字I/O。当接收加密数据时,可以根据需要读取套接字数据并将其推入加密引擎,当它吐出解密数据时,根据需要进行处理。当发送未加密的数据时,将其推入加密引擎,当它吐出加密的数据时,然后根据需要将其发送到套接字。这使您可以完全控制套接字。使用传统的OpenSSL API,OpenSSL接管了套接字的控制权