我正在尝试使用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套接字现在可以读取。SSL_write
调用中执行SSL重新协商。这只是将本地应用程序的TCP套接字上收到的数据的含义从加密的应用程序数据更改为会话重新协商数据。本地应用程序应该如何处理这些数据?它应该:
SSL_write
,因为它目前处于中间位置?SSL_read
会发生什么?答案 0 :(得分:0)
SSL_ERROR_WANT_READ和SSL_ERROR_WANT_WRITE可能由(重新)协商或完整套接字缓冲区引起,不仅可以在SSL_read和SSL_write中发生,还可以在非阻塞套接字上发生SSL_connect和SSL_accept。您所要做的就是等待所需的套接字状态(例如可读或可写),然后重复相同的操作。例如。如果从SSL_write获得SSL_ERROR_WANT_READ,则等待套接字可读(使用select,poll或类似),然后再次调用SSL_write。与SSL_read相同。
将SSL_CTX_set_mode与SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER | SSL_MODE_ENABLE_PARTIAL_WRITE一起使用也可能有用。