Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

CURL, incidenteel probleem

Pagina: 1
Acties:

  • MDVej
  • Registratie: September 2001
  • Laatst online: 04-10 11:40
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:
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?

Verwijderd

Je gebruikt al een timeout (dmv select)? Of werkt dit niet goed ofzo?

Wat is nu precies je probleem? Ook is het handig om even "=c" in de code tag te zetten zodat we syntax highlighting krijgen.

  • MDVej
  • Registratie: September 2001
  • Laatst online: 04-10 11:40
Verwijderd schreef op zondag 13 januari 2008 @ 18:30:
Je gebruikt al een timeout (dmv select)? Of werkt dit niet goed ofzo?

Wat is nu precies je probleem? Ook is het handig om even "=c" in de code tag te zetten zodat we syntax highlighting krijgen.
Het probleem is dat die timeout niet goed werkt, hij blijft gewoon hangen met een verbonden socket zonder dat er data binnenkomt.. Mijn vraag was of ik timeout goed heb gebruikt, en zo niet wat ik verkeerd heb gedaan.