Hallo Tweakers,
Ik heb een c programmatje gemaakt dat verbinding maakt met een webserver en vervolgens de data binnen krijgt en de verbinding verbreekt. Nu werkt dit normaal gesproken helemaal prima. Echter zit ik met het volgende probleem:
Wanneer de webserver in een bepaalde state is dat deze wel de verbinding opent, maar vervolgens geen data terug geeft. Blijft mijn script dus hangen. Wat ik dus wil is dat CURL na bijvoorbeeld 5 seconden geen data te hebben ontvangen de verbinding gewoon zelf sluit.
Ik maak gebruik van de volgende code om data binnen te halen:
Iemand enig idee?
Ik heb een c programmatje gemaakt dat verbinding maakt met een webserver en vervolgens de data binnen krijgt en de verbinding verbreekt. Nu werkt dit normaal gesproken helemaal prima. Echter zit ik met het volgende probleem:
Wanneer de webserver in een bepaalde state is dat deze wel de verbinding opent, maar vervolgens geen data terug geeft. Blijft mijn script dus hangen. Wat ik dus wil is dat CURL na bijvoorbeeld 5 seconden geen data te hebben ontvangen de verbinding gewoon zelf sluit.
Ik maak gebruik van de volgende code om data binnen te halen:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| static int fill_buffer(URL_FILE *file,int want,int waittime) { fd_set fdread; fd_set fdwrite; fd_set fdexcep; int maxfd; struct timeval timeout; int rc; /* only attempt to fill buffer if transactions still running and buffer * doesnt exceed required size already */ if((!file->still_running) || (file->buffer_pos > want)) return 0; /* attempt to fill buffer */ do { FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep); /* set a suitable timeout to fail on */ timeout.tv_sec = waittime; timeout.tv_usec = 0; /* get file descriptors from the transfers */ curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); /* In a real-world program you OF COURSE check the return code of the function calls, *and* you make sure that maxfd is bigger than -1 so that the call to select() below makes sense! */ rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); if (rc < 1) return 0; else { /* timeout or readable/writable sockets */ /* note we *could* be more efficient and not wait for * CURLM_CALL_MULTI_PERFORM to clear here and check it on re-entry * but that gets messy */ while(curl_multi_perform(multi_handle, &file->still_running) == CURLM_CALL_MULTI_PERFORM); } } while(file->still_running && (file->buffer_pos < want)); return 1; } |
Iemand enig idee?