Чтение сокета асинхронно с `read` и` epoll` - PullRequest
0 голосов
/ 21 февраля 2019

Что-то мне не хватает, когда дело доходит до epoll

В Win32, если сокет зарегистрирован под каким-то IOCP и нет данных для чтения сокетом, тогда выполняется асинхронное действие чтения с использованием ReadFile с некоторой перекрытой структурой вернет false и код ошибки WSA_IO_PENDING.

Когда доступны данные , тогда IOCP извлекает соответствующий overlapped буферданный ReadFile содержит только что прочитанные данные, и вы можете продолжить оттуда.

Когда дело доходит до Linux и epoll, я не понимаю.Если вы зарегистрируете сокет для какого-либо объекта epoll и данные недоступны, read просто вернет -1, а errno будет EWOULDBLOCK или EAGAIN.Я также понимаю, что мониторинг EPOLLIN наполовину полезен, так как EPOLLIN говорит о возможности чтения из сокета, а не о реальных существующих данных для чтения.

как можно сказать сокету "эй,Я хочу, чтобы в этот буфер было записано X или менее байтов данных. Если у вас сейчас нет данных, все в порядке - дайте их мне, когда вы это сделаете. Сообщите мне, когда данные хранятся в буфере "?

Возможно ли это с epoll объектом, как это возможно с IOCP?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Нет API, который бы уведомлял вас, когда X-данные доступны, или буфер считывает для вас.Существуют API, которые разблокируют , когда доступно любое ненулевое количество данных.Один из этих API - epoll_wait.Вам нужно будет самостоятельно прочитать и собрать данные X в свой буфер.

0 голосов
/ 21 февраля 2019

Не существует API сокетов Linux, который бы делал то, что вы хотите - т.е. выполнял операцию, когда сокет доступенВам всегда придется явно выполнять read в коде.

Лучшее, что вы можете сделать, - это иметь неблокирующий ввод-вывод с poll мультиплексированием или блокирующий ввод-вывод с потоком на сокет.

...