Openssl 如何判断何时无法在SSL连接上取得更多进展
这里 它说 “…这就是为什么了解任何端口上的任何可能的正向进程(以及返回WANT_READ的写入操作可能已经取得正向进程!)都要求您在所有端口上重试所有挂起的操作非常重要…” 因此,我是否正确地理解了返回Openssl 如何判断何时无法在SSL连接上取得更多进展,openssl,nonblocking,Openssl,Nonblocking,这里 它说 “…这就是为什么了解任何端口上的任何可能的正向进程(以及返回WANT_READ的写入操作可能已经取得正向进程!)都要求您在所有端口上重试所有挂起的操作非常重要…” 因此,我是否正确地理解了返回WANT\u read的SSL\u read()可能已经取得了进展(即使它没有返回任何数据) 我有一个事件驱动的单线程应用程序,它有3个非阻塞ssl套接字。当每个套接字完成连接时,我会一直读取套接字,直到得到一个WANT\u read。我的理解是,WANT\u READ意味着我现在可以调用se
WANT\u read
的SSL\u read()
可能已经取得了进展(即使它没有返回任何数据)
我有一个事件驱动的单线程应用程序,它有3个非阻塞ssl套接字。当每个套接字完成连接时,我会一直读取套接字,直到得到一个WANT\u read
。我的理解是,WANT\u READ
意味着我现在可以调用select()
并等待套接字准备好再次读取
当select()
返回时,一个循环通过3个套接字,分别调用ssl\u read()
假设套接字1上的读取返回了想要读取
但没有数据。
是否有可能套接字2返回一些数据,当没有更多的数据可读取时返回想要读取
,并且现在已经取得了一些进展,因此套接字1上的读取现在可以返回数据?但是由于循环已经完成了套接字1的读取,所以不会发生这种情况
由于循环已通过3个套接字,因此它在那里等待并挂起。这种情况会发生吗
如果是这种情况,我如何判断是否在所有3个插座上都无法取得更多进展?
例如,假设循环穿过
- 套接字1返回
李>WANT\u READ
- 套接字2返回一些数据,然后
(并取得进展,使套接字1现在可以返回数据)WANT\u READ
- 套接字3返回
李>WANT\u READ
- 套接字1现在返回数据,然后
WANT\u READ
- 套接字2返回
WANT\u READ
- 套接字3现在返回数据(因为套接字1上的读取进度足以让套接字3返回数据),然后
WANT\u read
- 套接字1:
返回所需读取ssl\u read()
- 套接字2:
返回数据,ssl\u read()
再次返回数据,然后ssl\u read()
最终返回想要读取的数据ssl\u read()
select()
。但是,我的应用程序仍在等待客户端已发送的数据。如果我让客户端启动另一个连接(同时保持原始连接处于活动状态),请选择returns,这就是我看到的:
- 套接字1:
返回数据,然后ssl\u read()
再次返回想要读取的数据ssl\u read()
- 套接字2:
返回所需读取ssl\u read()
- 套接字3(新):
返回数据,然后返回WANT\u readssl\u read()
ssl\u read()
返回负值时,您应该从ssl\u get\u error()
获取错误代码。如果错误代码为SSL\u error\u WANT\u READ,则意味着您应该等待(例如,使用select()
或poll
)使该套接字可读(直到一些数据从网络到达)。发生这种情况时,您应该再次在该套接字上重试SSL_read()您不必在您拥有的所有SSL套接字上重试SSL\u read()
,只需在返回SSL\u ERROR\u WANT\u read的套接字上重试即可。您应该使用SSL\u write()
(当它返回SSL\u ERROR\u WANT\u write
时)执行类似的操作
但是要小心,SSL\u read()
可能会返回(SSL\u get\u error()
也就是说)SSL\u error\u WANT\u WRITE
和SSL\u WRITE()
可能会返回SSL\u error\u WANT\u read
。这可能会发生,因为SSL需要发送/接收数据之外的一些附加消息(例如,为了发送数据,它需要先发送一些消息并接收响应)
总结如下:
n=SSL\u read()
返回:
a) n>0
-->您刚刚收到n
字节的数据
b) n<0
-->err=SSL\u get\u error()
返回
- SSL\u错误\u想要读取-->
直到套接字可读,然后再次调用select()
SSL\u读取()
- SSL\u错误\u想要写入-->
直到套接字可写,然后再次调用select()
SSL\u read()
n=0
-->if(SSL\u get\u shutdown(SSL*)和SSL\u RECEIVED\u shutdown)
:另一端确实清除了关机,否则关机不干净,但SSL连接已关闭。您也可以关闭套接字(SSL*对象)n=SSL\u write()
返回:
a) n>0
-->您刚刚发送了n
字节的数据
b) n<0
-->err=SSL\u get\u error()
返回
- SSL\u错误\u希望\u读取-->
直到套接字可读并调用select()