gpt4 book ai didi

select - SSL_connect 用于非阻塞套接字

转载 作者:行者123 更新时间:2023-12-03 10:08:40 27 4
gpt4 key购买 nike

我使用非阻塞套接字。对于普通的 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 检查套接字并使用 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...

关于select - SSL_connect 用于非阻塞套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28508374/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com