2016-09-09 37 views
0

我的目标是在获取请求后读取返回的http状态码(返回的第一行)。然后如果状态码是200,那么打印剩余的信息,否则只打印状态码。我怎样才能做到这一点?当我运行此我得到2个怪异输出C - 如何逐行读取HTTP GET请求的返回值?

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

另外:

我当前的代码返回整个网页。首先是奇怪的字母定位在一个奇怪的格式。其次,在我的新输入行的开始处有一个很长的无形代码。像这样:([用户名@韩〜桌面] $(长奇怪奇怪的代码的东西在这里))

+0

将损坏的参数修复为'fwrite'。第二个参数应该是1,而不是'sizeof(receiveBuffer)'。 –

+0

@DavidSchwartz谢谢你,摆脱了奇怪的角色。 –

回答

1

如果csd是一个文件句柄而不是文件描述符,我建议使用fgets通过处理输入的流线线。

但它不是:-)

所以,你有(至少)两个选项。

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

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

  • printf


    在你的狡猾的人物而言,这可能是受多种因素引起的,但我会找出来(再次,至少)。这样做的正确方法是printf("%s", dodgyString)以确保字符串中的任何%字符不会导致问题。

  • 制作大小为BUF_LEN的缓冲区,然后使用10000作为其限制。你应该真的使用BUF_LEN作为限制。
  • 参数为fwrite。您应该使用单位大小1和单位数chars_read,或者反过来。当你只看到chars_read会造成你的问题,写BUF_LEN * chars_read字符。
+0

如果不是太麻烦,是否有可能要求你告诉我如何逐行阅读?我是C –

+0

的新手谢谢,关于fwrite的观点是原因。我将它改为1,现在怪异的角色消失了。 –

+0

现在您需要编写一些代码来读取*行*。 –