我有一个阻塞的SSL BIO对象,我想发送数据。问题是连接在远程端被关闭,直到我执行读操作(BIO_write不会返回错误),我无法找到它。但是,在我发送之前我无法阅读,因为我不想阻止。最后,负责发送数据的代码和负责读取的代码是分开的,意味着失败的读取不能触发另一次发送。我该如何解决?如何确定阻止SSL BIO连接是否已关闭?
3
A
回答
1
有两种“关闭”状态,被称为“半关闭”状态。他们主要关心套接字的一端还是另一端将要发送更多应用程序数据。当您的recv
调用返回0时,它实际上是通知您没有更多数据要接收。但是,发送数据还是可以的,除非send
呼叫信号发出其他类型的错误信号,例如EPIPE
或ECONNRESET
(我不确定这些窗口与winsock等效的是什么,但我知道它们在那里)。如果SSL_write
没有返回错误,那是因为套接字的另一端仍然接受数据。
的recv
呼吁允许“没有更多数据”状态的无阻塞检查,这是可以做到这样的:
char c;
int r = recv(sock, &c, 1, MSG_DONTWAIT|MSG_PEEK);
如果r
是0
,插座已receved的迹象表明有从另一端没有更多待处理数据。否则,该调用将返回1
以获得一个字节的数据(由于MSG_PEEK
,它仍在输入缓冲区中)或-1
。如果errno
是EAGAIN
(这可能是因为MSG_DONTWAIT
)没有错误。应该查询任何其他errno
值,但可能表明套接字处于无效状态,需要关闭。
插座被关闭之前,OpenSSL的应用程序应该确保SSL_shutdown
返回1。然后,插座上的close
的SSL
对象被破坏(与)后发生。这意味着,除非应用程序出现异常,否则使用OpenSSL的套接字的双方应该已经看到SSL_shutdown
返回1
,然后双方都可以安全地关闭连接。
如果您想检查您的SSL
上下文的关闭状态,可以使用SSL_get_shutdown
,它将报告另一端是否已启动SSL_shutdown
序列。
相关问题
- 1. 如何确定是否连接到套接字已关闭
- 2. 如何确定SSE连接已关闭?
- 3. 的Python:TLS/SSL连接已关闭
- 4. 如何确定客户端的互联网连接是否已关闭?
- 5. 确定TCP连接是否使用SSL
- 6. Python机械化阻止连接:关闭
- 7. scanf如何确定是否阻止?
- 8. 如何知道客户端是否已关闭连接?
- 9. pyMySQL:如何检查连接是否已打开或关闭
- 10. SqlCommand.Dispose是否关闭连接?
- 11. 是否IDataReader.Dispose()关闭连接?
- 12. 如何阻止fancyBox关闭?
- 13. 如何确定上传连接是否安全(ssl)?
- 14. 如何确定matplot lib轴是否已通过axes.axis('off')关闭?
- 15. 如何确定文件是否已关闭
- 16. 如何确定子窗口是否已在javascript中关闭?
- 17. Rails:PG :: ConnectionBad(连接已关闭)
- 18. 如何使用阻塞BIO彻底关闭OpenSSL服务器?
- 19. 确定另一端是否突然关闭了tcp连接
- 20. 是否正在关闭连接以确定最佳实践?
- 21. 如何处理pymongo.errors.AutoReconnect:连接已关闭?
- 22. c#Compact Framework检测连接已关闭
- 23. MysqliDb - 检查连接是否关闭
- 24. MSDeploy“底层连接已关闭:连接意外关闭”
- 25. WCF:Close()是否真的关闭连接?
- 26. Java,Glassfish,连接已关闭
- 27. 如何在java连接池中检查连接是否关闭
- 28. 底层连接已关闭:连接意外关闭
- 29. class'psycopg2.InterfaceError':连接已关闭
- 30. 如何防止EF5 LocalDB连接关闭