2016-09-09 7 views
4

내 코드가 웹 사이트에 HTTP HEAD 요청을 보냅니다. 그런 다음 웹 사이트는 해당 정보로 응답합니다. 답장의 첫 줄에서 상태 코드를 어떻게 추출 할 수 있습니까? 상태 코드는 "HTTP/1.0"다음의 값으로 2xx 또는 3xx입니다.C - char 버퍼에서 숫자를 추출하려면 어떻게해야합니까?

코드 :

#define BUF_LEN 2048 

main(int argc, char *argv[]) 
{ 
    int csd; 
    struct sockaddr_in server; 
    struct hostent *server_host; 
    int server_len; 
    int string_size; 
    short server_port; 
    char req_buffer[BUF_LEN]; 
    char temp_buffer[BUF_LEN]; 
    char receiveBuffer[BUF_LEN]; 
    char resource_buffer[BUF_LEN]; 
    int t; 

    if(argc!=2) 
    { 
     fprintf(stderr,"Usage: %s <website> \n",argv[0]); 
     exit(EXIT_FAILURE); 
    } 

    server_host=gethostbyname(argv[1]); 
    if (server_host == NULL) 
    { 
     herror("While calling gethostbyname()"); 
     exit(EXIT_FAILURE); 
    } 

    csd=socket(PF_INET, SOCK_STREAM, 0); 
    if(csd<0) 
    { 
     perror("While calling socket()"); 
     exit(EXIT_FAILURE); 
    } 

    server.sin_family=AF_INET; 
    memcpy(&server.sin_addr, server_host->h_addr_list[0], server_host->h_length); 
    server.sin_port = htons(80); 
    server_len=sizeof(server); 
    t = connect(csd, (struct sockaddr *) &server, server_len); 
    if (t<0) 
    { 
     perror("while connecting()"); 
     exit(EXIT_FAILURE); 
    } 
    else 
    { 
     printf("connected to server\n\n"); 
    } 

    sprintf(temp_buffer, "HEAD/HTTP/1.0\r\n"); 
    strcpy(req_buffer, temp_buffer); 
    sprintf(temp_buffer, "HOST: %s\r\n", argv[1]); 
    strcat(req_buffer, temp_buffer); 
    sprintf(temp_buffer, "\r\n"); 
    strcat(req_buffer, temp_buffer); 

    printf(req_buffer); 

    write(csd, req_buffer, strlen(req_buffer)); 

    read(csd, receiveBuffer, BUF_LEN); 

    printf(receiveBuffer); 

    close(csd); 
} 
+1

사서를 쓰지 않는 이유 y [libcurl] (https://curl.haxx.se/libcurl/)을 좋아합니까? –

+0

@SanderDeDycker 내 대답에 곱슬 머리를 사용하려고 시도해주세요. –

답변

3
 #include <stdio.h> 

     int main() 
     { 
      char* inputstr = "HTTP/1.0 200"; 
      int response = 0; 
     /
      * On success, the sscanf returns the number of variables filled. 
      * In the case of an input failure before any data could be 
      * successfully read, EOF is returned. 
      */ 
      if(sscanf (inputstr, "HTTP/1.0 %d", &response) == 1) 
       printf ("response code %d\n",response); 
      else 
       printf ("It failed"); 
      return 0; 
     } 
0

라이브러리 함수 sscanf를(). 예 : 바로 명령이

0

당신이 사용할 수있는 내장되는 방법을 이해하지 못하기 때문에

string the_string = "foo -3.6 fum dum 17"; 
sscanf(the_string, "foo %f fum dum %d", &f, &i); 

내가 구체적인 예를 할 수 없습니다 curl.h

#include <curl/curl.h> 

int main(void) { 
    CURL *curl = curl_easy_init(); 
    if (curl) { 
     CURLcode res; 
     FILE *f = fopen("/dev/null", "wb"); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, f); 
     curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); 
     res = curl_easy_perform(curl); 
     if (res == CURLE_OK) { 
      long response_code; 
      curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code); 
      printf("response_code %ld", response_code); 
     } 
     curl_easy_cleanup(curl); 
    } 
    return 0; 
} 

테스트

gcc main.c -lcurl 
./a.out 
response_code 200⏎