電子書籍の厳選無料作品が豊富!

MacOSX、C言語でsocket(),writeなどを使ってサーバにリクエストを送り
レスポンスを標準出力しようとしています。

とりあえずレスポンスをbuf[BUFSIZ]にreadさせようとしているのですが、
レスポンスの内容のサイズがBUFSIZ以上だった場合、繰り返しreadさせる
必要があります。
なので(かなり簡潔に書きますが)

while(1)
if(buf[i]==EOF){break;}
n=read(socket,buf,sizeof(buf)-1);

みたいなことを考えました。がこれだとループが止まってくれません。
延々と読み込んでは表示してくれます。。。
たぶんHTTPレスポンスの終端がEOFだと思ったのが違うのだと思います。

HTTPレスポンスの終端というのはどう判断したらよいのでしょうか。
よろしくお願いいたします。

A 回答 (2件)

EOFは付加されないと思ったのですが、「延々と読み込んでは表示」という現象は、何か同じ文字列の繰り返し または 文字化けのような期待していないものでしょうか?


> n=read(socket,buf,sizeof(buf)-1);
readの戻り値nが正数の間はデータがありますのでループ、という判断をしては如何でしょうか?
do {
 n = read(...);
} while (n>0)

連続でリクエストを発行するプログラムというのでしたら、どのようなリクエストをされたか分かりませんが、逐一接続を完了したいという点との矛盾が生じて、Connection: Keep-Alive を指定しているなんて事はないでしょうか?

的外れな回答でしたら、すみません。
    • good
    • 0

socketでの送受信にはsend( ), recv( )関数を使われたほうが


while (recv(socket, buf, BUFSIZ, 0))
{
/*処理*/
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!