Может ли функция read () подключенного сокета вернуть ноль байтов? - PullRequest
26 голосов
/ 10 марта 2010

Я знаю, что read () является блокирующим вызовом, если я не сделаю сокет неблокирующим. Поэтому я ожидаю, что вызов read (), который запрашивает 4K данных, должен возвращать положительное значение (без чтения байтов) или -1 при ошибке (возможный сброс соединения клиентом и т. Д.). Мой вопрос: может ли read () вернуть '0' в любом случае?

Я обрабатываю read () следующим образом:

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

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

Этот код бомбы, если read () возвращает ноль, и я знаю, как это исправить. Но может ли read () вернуть ноль?

1 Ответ

48 голосов
/ 10 марта 2010

Когда TCP-соединение закрыто с одной стороны, read () с другой стороны возвращает 0 байт.

...