2
我使用curl和char URL [] =「file:/// d:/temporal/prueba1.txt」來測試使用硬盤驅動器文件以便接收數據。可捲曲只能讀取第一個2000字節?
我有以下問題:
- 跳過第2個字符的大文件:-solved-這是一個錯誤讀取
- 我想只讀一次(preferally第2000個字符)的數據這存在一個curl命令來做到這一點?
- 如果我讓在作家文件: 長longitud = strlen的(數據輸入),我得到比longitud尺寸* nmemb個更大的
- 捲曲無法通過公司網絡,但URLOpenBlockingStream()+閱讀()可以做它
- 有時捲曲回讀了很多來自url的erroneus數據。我認爲發生了連接錯誤,但我不明白
這是程序。 (注: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; }
謝謝。我發現捲曲更改ASCII:「0D 0A」到「0D 0d 0A」 – Pleyades 2011-02-11 08:35:14