使用 read 和 epoll 异步读取套接字

Reading a socket asynchronously with `read` and `epoll`

谈到 epoll

时,我想念一些东西

在 Win32 中,如果套接字在某些 IOCP 下注册并且没有数据可供套接字读取,则使用 ReadFile 和某些重叠结构发出异步读取操作将 return false 错误代码为 WSA_IO_PENDING.

当数据可用时,IOCP取出相关的overlapped,给ReadFile的缓冲区包含新读取的数据和你可以从那里继续。

说到linux和epoll,我就不明白了。如果你在某个 epoll 对象下注册了一个套接字并且没有数据可用,read 将只是 return -1errnoEWOULDBLOCKEAGAIN。我也明白监控 EPOLLIN 是半有用的,因为 EPOLLIN 谈论能够从套接字读取,而不是关于要读取的实际现有数据。

如何分辨插座"hey, I want X bytes of data or less to be written this buffer, If you don't have the data now, it's fine - give it to me when you do. notify me when the data is stored in the buffer"?

是否可以像使用 IOCP 那样使用 epoll 对象?

没有 Linux 套接字 API 可以做你想做的事 - 即在套接字可用时执行操作。您将始终必须在代码中明确执行 read

你能做的最好的事情是使用 poll 多路复用的非阻塞 IO,或者每个套接字一个线程的阻塞 IO。

没有 API 会在 X 数据可用或缓冲区读取时通知您。当 any 非零数据量可用时,有 API 将 解锁 。 API 其中之一是 epoll_wait。您将需要自己在缓冲区中读取和收集 X 数据。