2011-12-06 14 views
7

Estoy tratando de analizar la siguiente respuesta HTTP:C principiante: procesamiento de cadenas

HTTP/1.1 200 OK 
Date: Tue, 06 Dec 2011 11:15:21 GMT 
Server: Apache/2.2.14 (Ubuntu) 
X-Powered-By: PHP/5.3.2-1ubuntu4.9 
Vary: Accept-Encoding 
Content-Encoding: gzip 
Content-Length: 48 
Content-Type: text/html 

��(�ͱ���I�O����H�����ч�� 
         �4�@�B�$���S 

Quiero extraer "48" y el contenido binario.

Aquí es lo que he intentado hasta la fecha se:

//char* str contains the response 
    char * pch; 
    printf ("Splitting response into tokens:\n"); 
    pch = strtok (str,"\r\n"); 
    while (pch != NULL) 
    { 
     printf ("%s\n",pch); 
     pch = strtok (NULL, "\r\n"); 
    } 

Pero estoy un poco atascado ahora ... Cualquier ayuda es muy apreciada.


edición:

Esto es lo que he hecho hasta la fecha se:

char* pch; 
char* pch2; 
pch=strstr(buf,"Content-Length:"); 
pch2=strstr(pch,"\r\n"); 

¿Cómo puedo obtener el bit entre estos dos punteros?


Editar: Solución:

 char* pch; 
     char* pch2; 
     pch=strstr(buf,"Content-Length:"); 
     int i=0; 
     char contLen[20]; 
     for(i=0;i<20;i++){ 
       char next=pch[strlen("Content-Length:")+i]; 
       if(next=='\r' || next=='\n'){ 
         break; 
       } 
       contLen[i]=next; 
     } 
     printf("%d\n",atoi(contLen)); 
+0

Puede consultar http://curl.haxx.se/libcurl/c/ y la opción 'CURLOPT_WRITEHEADER' – Cyclonecode

+0

Quiero evitar el uso de CURL. Estoy haciendo todo usando sockets ... – Eamorr

Respuesta

6

¿Por qué no en lugar de buscar la cadena "Content-Length:"? luego desde ese punto avanza.

Puede utilizar strstr() para encontrar el punto en str, a continuación, mover el puntero char hacia adelante strlen ("Content-Length:") posiciones, a continuación, leer el valor con atoi()

no hay necesidad de tokenize toda la cadena

+0

Gracias por eso. He actualizado el OP. – Eamorr

2

Prueba esto:

const char* http_header = 
"HTTP/1.1 200 OK\r\n" \ 
"Date: Tue, 06 Dec 2011 11:15:21 GMT" \ 
"Server: Apache/2.2.14 (Ubuntu)\r\n" \ 
"X-Powered-By: PHP/5.3.2-1ubuntu4.9\r\n" \ 
"Vary: Accept-Encoding\r\n" \ 
"Content-Encoding: gzip\r\n" \ 
"Content-Length: 48\r\n" \ 
"Content-Type: text/html\r\n\r\n" \ 
"mydata"; 

// will point to start of data 
char* pdata = strstr((char*)http_header,"\r\n\r\n"); 
    // will point to start of 'Content-Length' header 
char* pcontent = strstr((char*)http_header,"Content-Length:"); 
    // get the length of the data 
int value = atoi(pcontent+15); 
+0

Por supuesto, debe verificar para que pdata y pcontent sean válidos antes de usarlos – Cyclonecode

+0

... y esperar que nadie ponga "Content-Length: -1" en la cadena del servidor. – caf

+0

No es de esperar que no) – Cyclonecode