SSL_connect 用于非阻塞套接字

Sof*_*are 4 select openssl nonblocking

我使用非阻塞套接字。对于普通的 TCP 连接,我在此处执行: 非阻塞套接字 - 如何检查连接是否成功?

但是对于 SSL_connect 调用,我无法让它工作。

我应该理解它: 1. 反复调用 SSL_connect。2. 检查 SSL_get_error 是否为 SSL_ERROR_WANT_READ 或 SSL_ERROR_WANT_WRITE。3. 如果是这样,那么我不是 100% 确定下一步要做什么。我应该调用 SSL_connect 直到我不明白吗?或者我应该像使用普通套接字一样,使用 read_fds 或 write_fds 检查套接字并使用 FD_ISSET 检查,如果是这样,请使用 SO_ERROR 检查getsockopt?

基本上,对于 SSL_connect 和非阻塞套接字,是什么告诉我连接成功了?我看过其他例子,但都不够清楚。

Val*_*ouk 5

这是一个算法:

int s = socket(...);
fcntl(s, ...); // make it non-blocking
while (-1 == connect(s,...))
{
   fd_set fds;
   FD_ZERO(&fds);
   FD_SET(s, &fds);
   select(s + 1, NULL, &fds, NULL, NULL);
}

... // initialize all SSL stuff
SSL_set_fd(ctx, s);
while (-1 == SSL_connect(ssl))
{
   fd_set fds;
   FD_ZERO(&fds);
   FD_SET(s, &fds);

   switch (SSL_get_error())
   {
   case SSL_ERROR_WANT_READ:
       select(s + 1, &fds, NULL, NULL, NULL);
       break;
   case SSL_ERROR_WANT_WRITE:
       select(s + 1, NULL, &fds, NULL, NULL);
       break;
   default: abort();
   }
}
// done...
Run Code Online (Sandbox Code Playgroud)