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()の特性上置換されてしまう。(しかも、置換対象を指定していない為なにが起こるかはメモリ次第...)