2017-11-02 10 views
0

イメージを取得するたびに、いくつかの文字(4)が表示されます。私はこのコマンドで画像を保存したい。/client example.com/image.jpg> img.jpg 最後にrecvに間違いがあると思う。ソケットHTTPリクエストで画像データを取得できない

sprintf(request, "%s %s %s%s%s%s", "GET", path, "HTTP/1.1\r\n", 
             "HOST:", hostname, "\r\n\r\n"); 

    //Send some data with TCP 
    if(send(sockfd, request, strlen(request), 0) < 0) { 
     printf("Send failed\n"); 
     exit(1); 
    } 


    // printf("Request sended\n"); 

    if(recv(sockfd, server_reply , sizeof(server_reply), 0) < 0) {//receive answer 
     printf("recv failed\n"); 
    } 

    char *data = strstr(server_reply, "\r\n\r\n");//save data after header 
    data+=4; 

    //printf("Server reply: \n");//print the answer 
    puts(data); 

    close(sockfd); 

    return 0; 
} 

私はすべてのイメージバイナリデータを受け取ることができないと思いますが、すべてを正しく取得する方法はわかりません。

+0

多くのことが間違っている可能性がありますが、 'recv'呼び出しが期待どおりのデータを返さない場合は、すべてのデータを取得するまでループ内で実行する必要があります。さらに、 'recv'が '\ 0'終了文字列を返すとは思わないでください。特にイメージはバイナリデータなので、 'puts'はどのような場合でもそれを印刷しようとすると悪い方法です。 – jxh

+1

関連:https://stackoverflow.com/questions/32856200/receive-recv-data-until-end-of-stream-using-http – jxh

+0

@jxhは正しい...彼が正しく参照しているリンクは、応答ヘッダーは、応答のコンテンツ本体を読み取る方法を教えます。さらに、 "画像"を受け取った場合、 "puts()"はバイナリデータではなく "文字列"を出力するため、 "puts()"を使用して出力することはできません。 – TonyB

答えて

0

あなたのコードと間違っていくつかあります。

  • あなたは、単一のsendは、すべてのデータを送信することが予想されるが。
    しかし、sendはデータの一部のみを送信することがあり、送信されたデータの量を確認するために戻り値をチェックし、必要に応じて再度送信する必要があります。
  • 単一のrecvが完全な応答を返します。
    しかし、recvは一度に取得できるデータ量だけ返され、指定されたサイズまでしか返されません。わずかなデータ以上のデータがある場合は、すべてのデータを取得するために複数のrecvが必要になる可能性が高いです。 recvがどれだけ戻ってくるかは、ローカルホストとLAN上のデータを交換する際にも異なる場合があります。
  • 応答が完了したときにTCP接続がすぐに終了すると予想されます。
    しかし、HTTP/1.1HTTP/1.0ではない)を使用しており、明示的にConnection: closeを指定していないため、サーバーは接続を開いたままにして、より多くのリクエストを待つことがあります。つまり、最後のrecvがハングアップする可能性があります。
  • イメージがHTTPヘッダーの後に1つの部分であると予想します。
    しかし、HTTP/1.1を使用し、HTTP/1.0を使用していないので、チャンクレスポンスも処理する必要があります。つまり、各ピースにプレフィックスが付いているボディが配信されます。

したがって、私はsendrecvが実際に何をするのかを学ぶことをお勧めします。また、HTTPトラフィックの痕跡を見るだけで、実際の標準の複雑さを得ることはできません。あなたがそれを単純なままにしておきたいなら、HTTP/1.0HTTP/1.1ではありません。

関連する問題