Curl只能读取前2000个字节吗?

时间:2011-02-10 09:41:25

标签: php c++ c curl

我将curl与char URL [] =“file:/// d:/temporal/prueba1.txt”一起使用,以便使用硬盘驱动器文件进行测试,以便接收数据。

我有以下问题:

  1. 在大文件中跳过前2个字符:-solved-读取数据时出错
  2. 我想只读一次(首先是2000个字符)它有一个curl命令来做吗?
  3. 如果我在作家文件中作出: long longitudinal = strlen(datain),我得到比尺寸大得多的纵向* nmemb
  4. Curl无法通过公司网络,但是URLOpenBlockingStream()+ read()可以做到这一点
  5. 有时Curl从url读回很多错误数据。我认为发生了连接错误,但我不明白
  6. 这是该计划。 (注意:使用线程调用pull_one_url()):

    static void *pull_one_url(void *ii){
    ix_bloque=initialize();
         lee_curl_c *lee_curl;//Curl class
    CURL *curl; 
    CURLcode result; 
    curl = curl_easy_init(); // Create our curl handle 
    char errorBuffer[CURL_ERROR_SIZE]=""; 
    char user_agent[]="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
    // Write all expected data in here 
    
    if (curl) 
    { 
        curl_easy_setopt(curl, CURLOPT_USERAGENT,user_agent);
        curl_easy_setopt(curl, CURLOPT_PORT, PC_PORT_a); // Check this before using 
        curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer); 
        curl_easy_setopt(curl, CURLOPT_URL, lee_curl->url[ix_bloque]); 
        curl_easy_setopt(curl, CURLOPT_HEADER, 0); 
        curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, D_TIMEOUT);//240 segundos
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 0);//SOLO primer http, ignorar sucesivos
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writer); 
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, lee_curl->buffer[ix_bloque]); 
        curl_easy_setopt(curl, CURLOPT_VERBOSE, VERBOSE_url);//Para ver que esta pasando
        // Attempt to retrieve the remote page  
        result = curl_easy_perform(curl); 
        if (errorBuffer[0])
        {
            fprintf(stderr, "\n##Tarea %li ERROR EN    %s DEBIDO A: %s",ix_bloque,lee_curl->url[ix_bloque],errorBuffer);
            lee_curl->estado[ix_bloque]=2;//error
        }
        else
        {
            fprintf(stderr, "\n##Tarea %li NO ERROR EN %s          ",ix_bloque,lee_curl->url[ix_bloque]);
            lee_curl->estado[ix_bloque]=1;//Lleno
        }
        // Always cleanup 
        curl_easy_cleanup(curl); 
    } 
    return NULL;    }
    

    这是作家功能:

    static size_t writer(void *vdata, size_t size, size_t nmemb, void *vbuffer_in){ 
    char *datain=(char *) vdata;
    char *buffer_in=(char *) vbuffer_in;
    nmemb*=size;//No multiplication needed anymore
    //long longitud=strlen(datain);//longitud always larger than nmemb 
    // Is there anything in the buffer? 
    if ( (buffer_in != NULL) && (buffer_in[0]=='\0') ) //CAUTION, reads only if buffer is empty!!!
    { 
        //strcat(buffer_in,data); //SIRVE si el fichero es de mas de 16kb OJO!
        if (nmemb<(D_BUFFER_SIZE-1))
        {
            memcpy(buffer_in,datain,nmemb);
            buffer_in[nmemb]='\0';//end of string
            fprintf(stderr,"\n###SUCCESSFUL, loaded :      %li bytes",nmemb);
        }
        else
        {
            memcpy(buffer_in,data,D_BUFFER_SIZE);
            buffer_in[D_BUFFER_SIZE-1]='\0';//end of string
            fprintf(stderr,"\n###WARNING, trying to load   %li LARGER THAN %li",nmemb,D_BUFFER_SIZE);
            fprintf(stderr," El tamano maximo curl=%li = %likB",CURL_MAX_WRITE_SIZE,CURL_MAX_WRITE_SIZE/1024);
        }
    return nmemb; 
    } 
    return 0;     }
    

1 个答案:

答案 0 :(得分:2)

CURLOPT_RANGE允许您请求文件/资源​​的一部分:

http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTRANGE