4

我的代码向网站发送 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);
}
4

3 回答 3

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;
      }
于 2016-09-09T10:01:23.253 回答
0

您可以使用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⏎   
于 2016-09-09T10:15:36.253 回答
0

库函数 sscanf()。例子:

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

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

于 2016-09-09T09:45:54.267 回答