Почему при чтении этого блокирующего сокета возвращается ноль, а ошибки нет? - PullRequest
2 голосов
/ 21 марта 2012

Этот код работает в Linux:

int r, c;
...
assert(0 == (O_NONBLOCK & fcntl(sockfd, F_GETFL, 0)));
errno = 0;
r = read(sockfd, &c, 1);
if (r == 0 && errno == 0) { 
    printf("What gives?\n");
}
...

, который выполняет чтение из сокета, иногда возвращает ноль (в r) и оставляет errno также равным нулю (0). С какой ситуацией я сталкиваюсь? Я действительно хотел бы иметь блок чтения, если не будет ошибки.

Ответы [ 2 ]

9 голосов
/ 21 марта 2012

Это означает, что клиент закончил отправку данных (например: shutdown для записи), и вы уже прочитали все доступные данные.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

В случае успеха возвращается количество прочитанных байтов. (ноль указывает на конец файла), и позиция файла увеличивается на это число.

3 голосов
/ 21 марта 2012

Обычно на справочной странице read написано:

В случае успеха возвращается количество прочитанных байтов (ноль означает конец файла)

значит 0 означает, что ваша розетка закрыта.

...