SSL_connect用于非阻塞套接字

时间:2015-02-13 20:40:07

标签: select openssl nonblocking

我使用非阻塞套接字。对于普通的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。 如果是这样,那我就不能100%确定接下来要做什么。我应该调用SSL_connect,直到我没有得到它?或者我应该像普通套接字一样,使用read_fds或write_fds检查套接字并检查FD_ISSET,如果是,请检查getsockopt和SO_ERROR?

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

2 个答案:

答案 0 :(得分:4)

这是一个算法:

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

答案 1 :(得分:0)

以下是使用带有内存BIOS的非阻塞套接字的方法示例。非阻塞IO用于填充内存BIO,并且仅在轮询循环表明它们不会阻塞时才进行IO调用。

https://gist.github.com/darrenjs/4645f115d10aa4b5cebf57483ec82eca