После успешного чтения сокета, настроенного как неблокирующее, сокет становится временно недоступным.Все данные получены уже при первом вызове read
, но возвращаемое значение ошибки сохраняется в течение 5 секунд.После этого read
возвращает 0 и сокет снова становится доступным.
Почему сокет возвращает ошибку в первую очередь?
Настройка неблокирующего сокета:
/* Non blocking */
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
Прочитать сокет и напечатать:
result = read(sockfd, response + bytes_read, RESPONSE_SIZE - bytes_read);
printf("%d | %d | %s\n", (int)result, errno, strerror(errno));
printf("%d | %d | %d | %d | %d | %d | %d | %d \n",
EAGAIN, EWOULDBLOCK, EBADF, EFAULT, EINTR, EINVAL, EIO, EISDIR);
Что приводит к:
152 | 115 | Operation now in progress
11 | 11 | 9 | 14 | 4 | 22 | 5 | 21
-1 | 11 | Resource temporarily unavailable
11 | 11 | 9 | 14 | 4 | 22 | 5 | 21