2016-09-09 39 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

現在您需要編寫一些代碼來讀取*行*。 –