2016-09-09 13 views
0

HEADリクエストをWebサイトのルートドキュメントに送信しようとしています。ここに私のコードです:C - ウェブサイトに適切なHEADリクエストを送信するにはどうすればよいですか?

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]); //resolve hostname 
    if (server_host == NULL) 
    { 
     herror("While calling gethostbyname()"); 
     exit(EXIT_FAILURE); 
    } 

    csd=socket(PF_INET, SOCK_STREAM, 0); //create socket 
    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"); 
    } 

    printf("input resource, with format'/(resource name)'\n"); //request for resource (for example /index.html) 
    scanf("%s", temp_buffer); 
    printf("retreiving HEAD...\n\n"); 

    sprintf(temp_buffer, "HEAD %s HTTP/1.0\r\n", resource_buffer); 
    strcpy(req_buffer, temp_buffer); 
    sprintf(temp_buffer, "HOST: %s\r\n", server_host); 
    strcat(req_buffer, temp_buffer); 

    sprintf(temp_buffer, "\r\n"); 
    strcat(req_buffer, temp_buffer); 

    write(csd, req_buffer, strlen(req_buffer)); 

    read(csd, receiveBuffer, BUF_LEN); 

    printf(receiveBuffer); 
} 

これまでのところ私は悪い要求を取得しています。私はウェブサイトを使ってテストしました:man7.org/linux/man-pages/index.htmlとman7.org/mtk/index.html

+0

少なくともHTTP 1.0にはホストヘッダーがありません。 1.1 –

+0

@SamKuhmonenねえコードを修正しましたが、依然として悪い要求が出ています。 –

+0

あなたはサーバーに送信している正確なリクエストを投稿できますか? –

答えて

1

まず、HTTP 1.0には存在しないhostヘッダーを使用しています。 1.1を使用する必要があります。また、キープアライブが使用されていないことを確認するためにconnection: closeを追加してください。

主な問題は、ホストヘッダーでserver_hostを使用する可能性が最も高いことです。これは文字列ではなく、構造体なので、リクエストにゴミを出力します。

単純なデバッグセッションまたは送信したリクエストを出力するだけでこのエラーが表示されます。

関連する問題