curl-library
Re: Use read/write with same curl handle.
Date: Tue, 28 Feb 2006 19:56:53 +0530
Thanks for taking it ahead
see my comments inline,
Daniel Stenberg wrote:
> On Tue, 28 Feb 2006, Nilesh wrote:
>
>> Can I use same curl handle to send and receive data ?
>
>
> Yes.
>
>> -- Using multi_perform and select to check if data is available to
>> send/recieve.
>>
>> Problem is that flow is coming to default case of switch, which tells
>> some data has come.
>
>
> What flow is coming to what "default case" ?
The flow is basically as follows where the default case indicate
there is data available to send/receive
curl_multi_perform(multi_handle, &still_running);
// while(CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle,
&still_running));
/* Now need to wait for SendInform response */
while(still_running)
{
struct timeval timeout;
fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd;
int timed_out = 0;
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
/* set a suitable timeout to play around with */
timeout.tv_sec = waitTime;
timeout.tv_usec = 0;
while(CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle,
&still_running))
{
printf("Insite while, calling curl_multi_perform
[still_running-%d]\n", still_running);
}
/** get file descriptors from the transfers */
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
printf("Wait here for [%d] seconds\n", waitTime);
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
switch(rc)
{
case -1:
/* select error */
break;
case 0:
/* timeout, do something else */
printf("Select Timeout happened\n");
timed_out = 1;
break;
default:
/* one or more of curl's file descriptors say there's data to read
or write */
printf("Have some data to process\n");
while(CURLM_CALL_MULTI_PERFORM ==
curl_multi_perform(multi_handle, &still_running));
break;
}*
Timeout in my case is 120 Seconds.
>
>> While DEBUGIng I am getting HTTP header details which I have received
>> with vaid content length, but it doesn't display data.
>
>
> Are you saying libcurl says the transfer is complete after only the
> headers have been transferred? I find that hard to believe.
This what I see when I enable debug support for curl. ( i am using
same function callback given in example directory )
I have additionaly using header_callback function also which prints
custome message give below ( "Incoming header has come" )
* Have some data to process
<= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK
Incoming header has come [HTTP/1.1 200 OK
]
<= Recv header, 27 bytes (0x1b)
0000: Server: Apache-Coyote/1.1
Incoming header has come [Server: Apache-Coyote/1.1
]
<= Recv header, 72 bytes (0x48)
0000: Accept: text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*
0040: ; q=.2
Incoming header has come [Accept: text/xml, text/html, image/gif,
image/jpeg, *; q=.2, */*; q=.2
]
<= Recv header, 16 bytes (0x10)
0000: SOAPAction: ""
Incoming header has come [SOAPAction: ""
]
<= Recv header, 38 bytes (0x26)
0000: Content-Type: text/xml;charset=utf-8
Incoming header has come [Content-Type: text/xml;charset=utf-8
]
<= Recv header, 21 bytes (0x15)
0000: Content-Length: 484
Incoming header has come [Content-Length: 484
]
<= Recv header, 37 bytes (0x25)
0000: Date: Tue, 28 Feb 2006 14:14:27 GMT
Incoming header has come [Date: Tue, 28 Feb 2006 14:14:27 GMT
]
Incoming header has come [
]*
PS : I am using write_callback similar to what has been given in
getinmemory.c ( example code)
Even I tried using default write callback which will write to FILE*
stream, which writting nothing in specified file .
>
>> I have also put debug printf in write_callback function to printf
>> received data, which doesn't really get printed.
>
>
> And you are sure you keep looping and calling the *perform() function
> as long as the transfer is still alive?
Yes I do that. I have posted the loop above.
Received on 2006-02-28