2010-11-12 19 views
4

J'utilise libcurl pour créer une connexion http à un serveur. Pendant l'initialisation, j'ai spécifié une valeur de délai d'inactivité de 5 secondes et également spécifié comme fonction de rappel de progression. Je m'attendais à ce que cURL abandonne la connexion après 5 secondes d'inactivité et arrête d'appeler le rappel de progression, mais j'ai trouvé que le curl s'éteint après environ 15 secondes. Pourquoi Curl prend plus de temps pour timeout que moi ce que j'ai spécifié? Le réglage du délai d'expiration à une valeur plus élevée n'aide pas. Si je spécifie 100 secondes, le délai d'attente est de 105 secondes d'inactivité.cURL: intervalle d'inactivité supérieur à la valeur spécifiée

code = s_curl_easy_setopt(m_curl_handle, CURLOPT_NOPROGRESS, 0); 
assert(code == CURLE_OK); 
code = s_curl_easy_setopt(m_curl_handle, CURLOPT_PROGRESSFUNCTION, progress_callback); 
assert(code == CURLE_OK); 

EDIT: Le code de délai d'attente

//this will set the timeout for quitting in case the network goes down 
code = s_curl_easy_setopt(m_curl_handle, CURLOPT_LOW_SPEED_LIMIT, 1); 
code = s_curl_easy_setopt(m_curl_handle, CURLOPT_LOW_SPEED_TIME, m_idle_timeout); 

Répondre

6

J'ai compris celui-ci. cURL met à jour sa progression environ une par seconde. Pour calculer le délai d'inactivité, cURL calcule le nombre moyen d'octets/s sur 6 mises à jour et le compare au CURLOPT_LOW_SPEED_LIMIT. Si cette valeur est inférieure à CURLOPT_LOW_SPEED_LIMIT pendant plus de CURLOPT_LOW_SPEED_TIME secondes, cela expire. Donc, si le CURLOPT_LOW_SPEED_TIME est de 5 secondes, cURL calculera le nombre moyen d'octets/s sur les 6 dernières mises à jour (environ 5 secondes) puis vérifiera si elle est inférieure à CURLOPT_LOW_SPEED_LIMIT pendant au moins 5 secondes, prenant ainsi environ 10 secondes.

0

(1) libcURL docs sur le PROGRESSFUNCTION dit:

Cette fonction est appelée par libcurl au lieu de son équivalent interne avec un intervalle fréquent pendant opération (environ une fois par seconde ou plus tôt) peu importe si les données sont transféré ou non.

(2) De quel "timeout" parlez-vous? Le seul que j'ai pu trouver se rapportait à un connexion timeout, qui ne concernerait pas la fin de la connexion après son établissement, et aucune donnée n'a été envoyée - comme vous semblez l'indiquer.

+0

Question modifiée pour ajouter le code de délai. – 341008