Что-то мне не хватает, когда дело доходит до epoll
В Win32, если сокет зарегистрирован под каким-то IOCP и нет данных для чтения сокетом, тогда выполняется асинхронное действие чтения с использованием ReadFile
с некоторой перекрытой структурой вернет false
и код ошибки WSA_IO_PENDING
.
Когда доступны данные , тогда IOCP извлекает соответствующий overlapped
буферданный ReadFile
содержит только что прочитанные данные, и вы можете продолжить оттуда.
Когда дело доходит до Linux и epoll, я не понимаю.Если вы зарегистрируете сокет для какого-либо объекта epoll
и данные недоступны, read
просто вернет -1
, а errno
будет EWOULDBLOCK
или EAGAIN
.Я также понимаю, что мониторинг EPOLLIN
наполовину полезен, так как EPOLLIN
говорит о возможности чтения из сокета, а не о реальных существующих данных для чтения.
как можно сказать сокету "эй,Я хочу, чтобы в этот буфер было записано X или менее байтов данных. Если у вас сейчас нет данных, все в порядке - дайте их мне, когда вы это сделаете. Сообщите мне, когда данные хранятся в буфере "?
Возможно ли это с epoll
объектом, как это возможно с IOCP?