2011-02-10 11 views
2

受信したデータをテーピングするためにハードドライブファイルを使用してテストするために、char URL [] = "file:/// d:/temporal/prueba1.txt"のcurlを使用しました。カールは最初の2000バイトだけを読み取ることができますか?

I次のような問題があります。大きなファイルで

  1. スキップ最初の2つの文字を:それは私は一度だけ(preferally最初の2000文字)を読みたい
  2. データの読み取りエラーだったことを-solved-それを行うカールコマンドが存在する?
  3. 私はライターのファイルを作成する場合: 長いlongitudの=のSTRLEN(DATAIN)、私はlongitudサイズよりもはるかに大きい取得* nmemb個
  4. カールが企業ネットワークを通過することはできませんが、URLOpenBlockingStream()+読んで()行うことができますit
  5. 時々、CurlはURLからの誤ったデータをリードバックします。接続エラーが起こったと思いますが、わかりません。

これはプログラムです。 (注意: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;  } 

答えて

2

CURLOPT_RANGEは、ファイル/リソースの一部を要求することを可能にする:

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

+0

ありがとうございます。私はカールがASCIIを変えたことを発見しました: "0D 0A"から "0D 0d 0A" – Pleyades

+0

いいえ、それはありません。しかし、それは私に信じているバイナリデータを送信します... –

+0

OK !!あなたは正しいダニエルです。 fprintfを使ってファイルに書き込むときに、キャリッジリターンの前に0x0dを追加すると問題が起こります。だから私はバイナリモードで開く必要がありました: 'fopen(" output.txt "、" wb ")' @Daniel Stenberg – Pleyades

関連する問題