curl-library
Problem with curl_multi C API
Date: Thu, 18 Mar 2010 14:33:21 +0100
Hello,
I have a problem with curl multi API on several platforms.
I try to fetch map tiles from open street map and I use curl_multi API  
to fetch them faster.
My problem is when one or more request return 404 error, the other  
request doen't work and images are not downloaded correctly.
I use this code to generate easy_handles:
   // Initialize curl handle
   CURL * lEasyHandle;
   lEasyHandle = curl_easy_init();
   if (!lEasyHandle)
   {
     itkExceptionMacro( <<"Tile Map IO : Curl easy handle init error.");
   }
   // Create file
   FILE* lOutputFile = fopen(tileInfo.filename.c_str(), "w");
   if (lOutputFile == NULL)
   {
     itkExceptionMacro(<<"TileMap read : bad file name.");
   }
   // Add file to vector
   m_ListFiles.push_back(lOutputFile);
   // Param easy handle
   curl_easy_setopt(lEasyHandle, CURLOPT_USERAGENT, m_Browser.data());
   curl_easy_setopt(lEasyHandle, CURLOPT_URL, m_ListURLs.back().data());
   curl_easy_setopt(lEasyHandle, CURLOPT_WRITEDATA, m_ListFiles.back());
   // Add easy handle to multi handle
   curl_multi_add_handle(m_MultiHandle, lEasyHandle);
   // Add hanle to vector
   m_ListCurlHandles.push_back(lEasyHandle);
And this one to perform requests:
   // Configure multi handle - set the maximum connections
   curl_multi_setopt(m_MultiHandle, CURLMOPT_MAXCONNECTS, 10);
   curl_multi_setopt(m_MultiHandle, CURLMOPT_PIPELINING, 0);
     // Perform
  int lStillRunning;
   while(
     CURLM_CALL_MULTI_PERFORM == curl_multi_perform(m_MultiHandle,  
&lStillRunning)
   );
   // Now get that URL
   while(lStillRunning)
   {
     struct timeval timeout;
     int rc; // Return code
     fd_set fdread;
     fd_set fdwrite;
     fd_set fdexcep;
     int maxfd;
     FD_ZERO(&fdread);
     FD_ZERO(&fdwrite);
     FD_ZERO(&fdexcep);
     /* set a suitable timeout to play around with */
     timeout.tv_sec = 0;
     timeout.tv_usec = 1;
     /* get file descriptors from the transfers */
     curl_multi_fdset(m_MultiHandle, &fdread, &fdwrite, &fdexcep,  
&maxfd);
     rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
     switch(rc) {
     case -1:
       /* select error */
       break;
     case 0:
       /* timeout */
     default:
       /* timeout or readable/writable sockets */
       while(
         CURLM_CALL_MULTI_PERFORM == curl_multi_perform(m_MultiHandle,  
&lStillRunning)
       );
       break;
     }
   }
   int remaining_msgs = 1;
   int error = 0;
   CURLMsg *msg;
   while (remaining_msgs)
   {
     msg = curl_multi_info_read(m_MultiHandle, &remaining_msgs);
     if (msg != NULL)
     {
       if (CURLE_OK != msg->data.result)
         error = 1;
     }
   }
Can you help me to find where I do something wrong?
Many thanks
Etienne
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette:  http://curl.haxx.se/mail/etiquette.html
Received on 2010-03-18