我使用无阻塞插座。对于普通的TCP连接,我按以下步骤操作:
Non blocking socket - how to check if a connection was successful?

但是对于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通过select检查套接字,并使用FD_ISSET检查,如果是,则使用SO_ERROR检查getsockopt?

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

最佳答案

这是一个算法:

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...

10-06 01:23