【问题标题】:C - How can I extract numbers from a char buffer?C - 如何从 char 缓冲区中提取数字?
【发布时间】:2016-09-09 09:39:32
【问题描述】:

我的代码向网站发送 HTTP HEAD 请求。该网站然后回复其信息。如何从回复的第一行中提取状态码?状态码是“HTTP/1.0”之后的值,它是 2xx 或 3xx。

代码:

#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);
}

【问题讨论】:

  • 为什么不使用像libcurl 这样的库?
  • @SanderDeDycker 请看看我在回答中使用 curl 的尝试

标签: c http-head


【解决方案1】:
       #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;
      }

【讨论】:

    【解决方案2】:

    库函数 sscanf()。示例:

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

    我无法举出具体的例子,因为我没有正确理解如何构建指令

    【讨论】:

      【解决方案3】:

      您可以使用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⏎   
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-26
        • 1970-01-01
        • 1970-01-01
        • 2012-10-04
        • 2012-05-27
        • 1970-01-01
        相关资源
        最近更新 更多