Я пытаюсь читать из блокирующего сокета, но мне интересно, что read()
возвращает -1, что, я думаю, означает, что в настоящее время нет данных для чтения - я ожидаю, что они блокируются, пока не смогут прочитать количество байт.
Я также пытался убедиться, что сокет находится в режиме блокировки и что большой тайм-аут установлен с помощью:
int setBlockingIO(int fd)
{
int flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags & (~O_NONBLOCK));
int nTimeout = 30000; // 30 seconds
setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&nTimeout, sizeof(int));
}
Но это ничего не изменило.
Мой вопрос:
- Что я должен сделать, что
read()
будет really block?
- Есть ли какие-нибудь подводные камни, на которые я могу попасть? (ошибка в моей программе?)
Я знаю, что есть другой вопрос по этой теме, но там я не могу найти ответ на свой вопрос.
UPDATE
Без установки таймаута read()
также возвращает (субъективно) немедленно -1
ОБНОВЛЕНИЕ 2
errno
равно 107 (ENOTCONN, Transport endpoint is not connected)
.
Но клиентская сторона не закрыла соединение в это время (гарантируется длительным sleep()
после write()
)