HTTP Client の動作フロー その8 : read() でレスポンスを読み込む

write()でHTTPリクエストをサーバに送信したあとは、read()関数でサーバからのHTTPレスポンスを読み込みます。

//バッファを空に
memset(buf, 0, sizeof(buf));

//レスポンスを受信して出力
do {
        
        //バッファ分読み込む
        n = read(sfd, buf, sizeof(buf));		

        
        //標準出力に表示
        if(write(STDOUT_FILENO, buf, n) < 0) {
                perror("write STDOUT");
                return 1;
        }
        
} while(n > 0);

//エラー処理
if(n == -1) {
        perror("");
        return 1;
}

//ソケットを閉じる
close(sfd);

ここでは、read()関数で読み込んだHTTPレスポンスをwrite()関数でそのまま標準出力に出力しています。

追記 20090529

読み込んだレスポンスを表示する処理でprintf()を使用していましたが、バッファーサイズより大きなページを読み込んで表示する時に問題が発生したため、write()を使用するように変更。

printf()を使う際の問題点
  • バッファーサイズより大きなファイルを読み込んだ場合、末尾が'\0'になっていない文字列を出力することになる
  • bufを空にしていなかった為、前に読み込んだデータが残ってしまっていた。
  • '%'という文字列が入っていると、printf()の特性上置換されてしまう。(しかも、置換対象を指定していない為なにが起こるかはメモリ次第...)