Sockets (SSL or otherwise) are layer-3 objects while content is a layer-7
object.  To get an accurate end-of-content marker, you'll need to parse the
output, buts since you are using the https protocol, that's going to be
easy.

Essentially, parse out the "Content-Length" header and read that many bytes
past the end of the http headers.




On 11 January 2014 19:46, M. V. <bored_to_deat...@yahoo.com> wrote:

> Hi everybody,
>
> I'm writing an application that creates multiple non-blocking SSL
> connections to an https server, in each one I send a request and read the
> server's response. my problem is, whatever I do, I can't determine when the
> response data is finished. here's part of my code responsible for sending
> and receiving data:
>
> ....
> 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....
>
> my problem with above code is, if I set select timeout to a small time, I
> can't guarantee that all data is received (because some servers are really
> slow), and if I set timeout to a long time (5-10 seconds), my socket is
> getting stucked in wait-state for a long time and I can't use the response
> before that. I tried to make this work by using "BIO_should_read()" or
> "BIO_pending()" functions, but none of them is giving me what I want. so,
> Is there a way to determine when exactly there is nothing else to read on
> the SSL socket?
>
> Thank you.
>
>

Reply via email to