2011-12-06 34 views
7

Tôi đang cố gắng để phân tích phản ứng HTTP sau:C mới bắt đầu: string phân tích

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 

tôi muốn trích xuất "48" và nội dung nhị phân.

Đây là những gì tôi đã cố gắng sofar:

//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"); 
    } 

Nhưng tôi kinda khó khăn bây giờ ... Any help is appreciated rất nhiều.


chỉnh sửa:

Dưới đây là những gì tôi đã làm sofar:

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

Làm thế nào tôi có thể nhận được các bit giữa hai con trỏ này?


Edit: giải pháp:

 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

Bạn có thể kiểm tra http://curl.haxx.se/libcurl/c/ và tùy chọn 'CURLOPT_WRITEHEADER' – Cyclonecode

+0

Tôi muốn tránh sử dụng CURL. Tôi đang làm mọi thứ bằng cách sử dụng ổ cắm ... – Eamorr

Trả lời

6

Tại sao bạn không thay tìm kiếm chuỗi "Content-Length:"? sau đó từ đó di chuyển về phía trước.

Bạn có thể sử dụng strstr() để tìm chỗ ở str, sau đó di chuyển con trỏ char mong strlen ("Content-Length:") vị trí, sau đó đọc giá trị sử dụng atoi()

không có nhu cầu để tokenize toàn bộ chuỗi

+0

Cảm ơn vì điều đó. Tôi đã cập nhật OP. – Eamorr

2

Hãy thử điều này:

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

Tất nhiên bạn nên kiểm tra pdata và pcontent là hợp lệ trước khi sử dụng chúng – Cyclonecode

+0

... và hy vọng rằng không ai đặt "Content-Length: -1" vào chuỗi Server của họ? – caf

+0

Không hy vọng không =) – Cyclonecode

Các vấn đề liên quan