我使用无阻塞插座。对于普通的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...