在Openssl调用返回WANT\u WRITE后,TLS Openssl连接中使用的TCP套接字变得可读 我试图在C++中使用TCP套接字创建一个通用的TLS,使用OpenSSL。套接字将用于运行select循环并利用非阻塞I/O的程序中

在Openssl调用返回WANT\u WRITE后,TLS Openssl连接中使用的TCP套接字变得可读 我试图在C++中使用TCP套接字创建一个通用的TLS,使用OpenSSL。套接字将用于运行select循环并利用非阻塞I/O的程序中,ssl,openssl,Ssl,Openssl,我担心的是,在上一个SSL\u get\u error调用返回SSL\u error\u WANT\u WRITE后,底层TCP套接字变得可读。我可以想到两种可能发生这种情况的情况: 本地应用程序和远程应用程序同时决定发送大量数据。两个应用程序同时调用SSL\u write,随后两个应用程序上的SSL\u get\u error调用返回SSL\u error\u WANT\u write。从两个应用程序发送的TCP数据包在线路上交叉。本地应用程序的TCP套接字现在在上一个SSL\u get\u

我担心的是,在上一个
SSL\u get\u error
调用返回
SSL\u error\u WANT\u WRITE
后,底层TCP套接字变得可读。我可以想到两种可能发生这种情况的情况:

  • 本地应用程序和远程应用程序同时决定发送大量数据。两个应用程序同时调用
    SSL\u write
    ,随后两个应用程序上的
    SSL\u get\u error
    调用返回
    SSL\u error\u WANT\u write
    。从两个应用程序发送的TCP数据包在线路上交叉。本地应用程序的TCP套接字现在在上一个
    SSL\u get\u error
    调用返回
    SSL\u error\u WANT\u WRITE
    后可读
  • 如上所述,除了远程Openssl库决定在写入任何应用程序数据之前在
    SSL\u write
    调用中执行SSL重新协商之外。这只是将在本地应用程序的TCP套接字上接收的数据的含义从加密的应用程序数据更改为会话重新协商数据
本地应用程序应该如何处理这些数据?如果它:

  • 调用
    SSL\u write
    ,因为它当前处于写入中期
  • 调用
    SSL\u read
    ,就像套接字空闲时那样

SSL\u错误\u想要\u读取和SSL\u错误\u想要\u写入可能由(重新)协商或完全套接字缓冲区引起,不仅可能发生在SSL\u读取和SSL\u写入中,而且还可能发生在非阻塞套接字上的SSL\u连接和SSL\u接受中。您只需等待想要的套接字状态(例如可读或可写),然后重复相同的操作。例如,如果您从SSL_write中获得SSL_错误_WANT_READ,请等待套接字变得可读(使用select、poll或类似方法),然后再次调用SSL_write。与SSL_read相同


将SSL_CTX_set_模式与SSL_模式(接受)移动(写入)缓冲区| SSL(写入)模式(启用)部分(写入)一起使用可能也很有用。

谢谢。在我的问题中的场景中,本地应用程序的TCP套接字上接收到的数据会发生什么情况?SSL以帧的形式读取/写入数据,例如,每个SSL_写入的数据在至少一个以大小(最大16k)为前缀的帧中包在一起。如果由于内核中的套接字缓冲区已满而无法在SSL_write中发送完整帧,那么它将发送尽可能多的数据,保持其余数据处于缓冲状态并返回SSL_ERROR_WANT_write。如果它返回错误,因为它需要数据来完成握手(例如,(重新)协商),那么在握手完成之前它不会发送任何数据。谢谢Steffen。这个解释是有道理的,但是,它没有回答我的问题。例如,如果应用程序在
SSL\u write
返回
SSL\u ERROR\u WANT\u write
后接收TCP数据,该怎么办?有关何时可能发生这种情况的示例,请参阅开始问题。如果套接字可读(并且SSL连接已建立),则应调用SSL_read,除非最后一次调用SSL_write返回SSL_ERROR_WANT_read。只有在后一种情况下,您才应该重试SSL_write。如果我正确理解您的意思,则可以调用
SSL_read
,同时有一个未完成的、部分完成的写入操作。例如,以下内容是有效的:1)调用
SSL\u write
,这恰好部分完成,返回
SSL\u ERROR\u WANT\u write
,2)套接字变得可读,因此调用
SSL\u read
,3)套接字变得可写,因此调用
SSL\u write
SSL\u read
调用是否不会干扰部分完成的写入操作?另请参阅非阻塞
SSL\u write