【发布时间】:2014-01-15 22:34:23
【问题描述】:
我正在尝试使用 Openssl 在 C++ 中通过 TCP 套接字创建通用 TLS。套接字将用于运行选择循环并利用非阻塞 I/O 的程序中。
我担心在上一个 SSL_get_error 调用返回 SSL_ERROR_WANT_WRITE 之后底层 TCP 套接字变得可读的情况。我可以想到两种可能发生这种情况的情况:
- 本地应用程序和远程应用程序同时决定发送大量数据。两个应用程序同时调用
SSL_write,随后对两个应用程序的SSL_get_error调用返回SSL_ERROR_WANT_WRITE。从两个应用程序发送的 TCP 数据包在线路上交叉。在之前的SSL_get_error调用返回SSL_ERROR_WANT_WRITE之后,本地应用程序的 TCP 套接字现在可以读取。 - 如上所述,除了远程 Openssl 库决定在写入任何应用程序数据之前在
SSL_write调用中执行 SSL 重新协商。这只是将本地应用程序的 TCP 套接字上接收到的数据的含义从加密的应用程序数据更改为会话重新协商数据。
本地应用程序应该如何处理这些数据?应该:
- 调用
SSL_write,因为它目前正在编写中? - 如果套接字空闲,调用
SSL_read会发生什么情况?
【问题讨论】:
-
一个更好的非阻塞线程
SSL_writeopenssl.6102.n7.nabble.com/…