我使用非阻塞套接字。对于普通的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和非阻塞套接字,是什么告诉我连接成功了? 我看过其他例子,但没有一个足够清楚。
答案 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