我有一个使用多个阻塞套接字的服务器线程,当有数据要处理时我需要它运行。问题是,我如何让 OpenSSL 做“它的事情”(比如重新协商)而不陷入阻塞操作(等待应用程序数据)?注意:我有SSL_set_mode - SSL_MODE_AUTO_RETRY
并且我怀疑我不需要这样做并自己处理这些案件,但是从阅读文档中不清楚我将如何完成这一点。考虑以下伪代码:
while(running){
select on readability sockets 1 and 2
if(socket 1 readable) {
SSL_read data(socket 1)
process data, possibly interacting with socket 2
}
if(socket 2 readable) {
SSL_read data(socket 2)
process data, possibly interacting with socket 1
}
}
如果由于任一套接字上存在 SSL/TLS 层“要做的事情”而不是应用层数据而导致选择退出会发生什么? SSL_read
将处理“要做的事情”,然后因为没有应用程序数据而阻塞……该阻塞会破坏从另一个套接字读取的能力。有一个很好的方法SSL_pending
可以告诉我有关应用程序数据的信息,但是据我所知,如果没有 a ,堆栈就没有机会获取任何数据SSL_read
。除了将套接字分离到单独的线程或使用非阻塞套接字之外,还有一种简单的方法可以对 OpenSSL 层说“如果需要,请重新协商,如果有则读取数据记录,但如果有则不阻塞”两者都不需要”? 诸如 NULL/NULL 读取或写入之类的东西?
// process records on the socket
SSL_read( ssl, 0, 0 ); // or maybe SSL_write( ssl, 0, 0 ) ?
if ( SSL_pending( ssl ) ) {
// do the application data read
SSL_read( ssl, buf, sizeof(buf) );
}
编辑:尝试在SSL_read( ssl, 0, 0 )
没有选择读取的情况下进行操作,它会阻止记录,因此无法正常工作。执行 select then read-0/0 或SSL_write( ssl, 0, 0 )
without select 似乎不会阻塞,尽管我还不确定是否正在做我需要做的事情......