C - 如何逐行读取HTTP GET请求的返回值?

时间:2016-09-09 06:12:45

标签: c http-get

我的目标是在get请求之后读取返回的http状态代码(返回的第一行)。然后,如果状态代码是200,则打印剩余的消息,否则只打印状态代码。我怎样才能做到这一点?

我当前的代码返回整个网页:

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;
    int chars_read;

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

    while (1) 
    {
        chars_read = read(csd, receiveBuffer, 10000);
        if (chars_read == 0)
            return;
        fwrite (receiveBuffer, sizeof (receiveBuffer), chars_read, stdout);
    }

    close(csd);
}

当我运行这个时,我得到2个奇怪的输出。首先是以奇怪格式定位的奇怪字母。其次,在我的新输入行的开头有一个很长的无形代码。像这样:([username @ han~Desktop] $(这里有长期奇怪的代码))

1 个答案:

答案 0 :(得分:1)

如果csd是文件句柄而不是文件描述符,我建议使用fgets逐行处理输入流。

但事实并非如此: - )

所以你(至少)有几个选择。

首先,您可以逐个字符地读取,将其添加到缓冲区,然后,当您读取换行符时,将所述缓冲区传递给函数以处理enire行,然后将缓冲区清零并继续。

或者您可以阅读整个消息并以类似的方式对其进行后处理,查找嵌入的换行符并将相关部分(即一行)传递给函数进行处理。

就你的狡猾角色来说,这可能是由许多事情引起的,但我一直在寻找(再次,至少):

  • printf带有不受控制的字符串。执行此操作的正确方法是printf("%s", dodgyString),以确保字符串中的任何%字符不会导致问题。
  • 制作一个大小为BUF_LEN的缓冲区,然后使用10000作为限制。您应该使用BUF_LEN作为限制。
  • fwrite的参数。您应该使用单位大小1和单位数chars_read,或者相反。只读BUF_LEN * chars_read时写chars_read字符会导致问题。