web-dev-qa-db-ja.com

接続されたソケットのread()関数は0バイトを返すことができますか?

ソケットを非ブロッキングにしない限り、read()がブロッキング呼び出しであることはわかっています。したがって、4Kのデータを要求するread()呼び出しは、正の値(バイト数の読み取りなし)またはエラー時に-1(クライアントによる接続のリセットなど)を返すはずです。私の質問は:read()はいつでも「0」を返すことができますか?

私はこのようにread()を処理しています:

   if ((readval = read(acceptfd, buf, sizeof(buf) - 1)) < 0)
    {

    }
    else
    {
       buf[readval] = 0;
       //Do some thing with data  
    }

このコードは、read()がゼロを返した場合に攻撃され、修正方法を知っています。しかし、read()がゼロを返すことは可能ですか?

28
kumar

TCP接続が片側で閉じられている場合、反対側のread()は0バイトを返します。

49
Sergei Kurenkov