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 和非阻塞套接字,是什么告诉我连接成功了?我看过其他例子,但都不够清楚。
这是一个算法:
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)