【发布时间】:2014-01-30 08:47:53
【问题描述】:
我正在编写一个应用程序,它创建多个到 https 服务器的非阻塞 SSL 连接,在每个连接中我发送一个请求并读取服务器的响应。我的问题是,无论我做什么,我都无法确定响应数据何时完成。这是我负责发送和接收数据的代码的一部分:
....
fd_set connectionfds;
struct timeval timeout2;
FD_ZERO(&connectionfds);
FD_SET(socket_server, &connectionfds);
timeout2.tv_usec = 0;
timeout2.tv_sec = 1;
while(1)
{
r=BIO_read(io,buf,BUFSIZZ-1);
if (r>0){
//gather data
continue;
}
else if (SSL_get_error(ssl, r)==SSL_ERROR_WANT_READ){
int ret = select(socket_server + 1, &connectionfds, NULL, NULL, &timeout2);
if (ret <= 0){
break;
}
continue;
}
else{
break;
}
}
// use whole gathered data
....
我对上面代码的问题是,如果我将选择超时设置为小时间,我不能保证所有数据都被接收(因为有些服务器真的很慢),如果我设置超时时间很长(5 -10 秒),我的套接字长时间处于等待状态,在此之前我无法使用响应。 我试图通过使用“BIO_should_read()”或“BIO_pending()”函数来完成这项工作,但它们都没有给我我想要的东西。 那么,有没有办法确定什么时候 SSL 套接字上没有其他内容可以读取?
【问题讨论】:
-
“我无法确定响应数据何时完成”是什么意思?是否表示连接已关闭?
-
@MarianV 我正在编写一个类似浏览器的应用程序。当我尝试从任何 https 网站(如 yahoo-mail 等)获取响应时,在我发送我的 http 请求后,我使用 BIO_read 读取响应,但在读取整个响应后没有任何反应,我必须等待很长时间select() 超时,知道响应完成。 Firefox、chrome 等浏览器如何感知这一点?因为他们都在收到全部数据后立即关闭连接。
标签: c sockets select ssl timeout