【问题标题】:SSL_connect for non blocking socketSSL_connect 用于非阻塞套接字
【发布时间】:2015-02-13 20:40:07
【问题描述】:

我使用非阻塞套接字。对于正常的 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 和非阻塞套接字,是什么告诉我连接成功了? 我看过其他例子,但都不够清楚。

【问题讨论】:

  • 您的猜测是正确的:您应该根据操作结果使用pollselect api 等待适当的套接字事件。并重复操作。
  • 但是我应该只调用一次 SSL_connect 吗?我在等什么?如果为我的套接字设置了读或写,这是什么意思?我该怎么办?我是否打电话给getsockopt?
  • 通常你给SSL_connect一个连接的socket。该函数不是用于底层连接操作,而是用于安全协议设置。
  • 是的,我知道。我可以使用阻塞套接字进行 SSL_connect。但我不确定非阻塞的。我需要的是整个过程的一些伪代码。

标签: select openssl nonblocking


【解决方案1】:

这是一个算法:

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

【讨论】:

  • Ty 但我不明白选择调用的重点。它达到什么目的。?我停止错误或 SSL_connect != -1。 select调用添加了什么?
  • select 阻止执行,直到套接字变得可读或可写。 IE。要么网络缓冲区中有数据要从远程对等方读取,要么输出缓冲区中有可用空间用于发送。
  • 我无法阻塞,这就是我使用非阻塞套接字的原因。我能做的是反复调用 SSL_connect 并在两者之间做其他事情,是否可以只调用 SSL_connect 直到它连接或出现错误?选择调用除了等待没有意义吗?
  • 只要你的事件循环为空,你就应该阻塞。 IE。当它无事可做时。如果你只是重复调用函数,你会过度使用 CPU 资源。或者,如果你可以不时调用它,它也会以某种方式工作,但只会产生额外的内核调用。
  • 好的,但要明确一点,只需要轮询 SSL_connect 直到它成功或失败并出现除 WANT_READ 或 WRITE 之外的另一个错误?
【解决方案2】:

这是一个使用非阻塞套接字和内存 bios 的方法示例。非阻塞 IO 用于填充内存 BIO,只有在轮询循环表明它们不会阻塞时才会进行 IO 调用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-31
    • 2013-10-15
    • 1970-01-01
    • 2012-06-03
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多