使用`read`和`epoll`

时间:2019-02-21 15:16:53

标签: c linux sockets epoll iocp

关于epoll

我有些想念

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

如果有数据 可用,那么IOCP会取出相关的overlapped,给ReadFile的缓冲区包含新读取的数据,您可以从那里继续

关于linux和epoll,我不明白。如果您在某个epoll对象下注册了一个套接字,但没有可用数据,则read只会返回-1并且errnoEWOULDBLOCKEAGAIN 。我也了解监视EPOLLIN是半满的,因为EPOLLIN谈论能够从套接字读取,而不是要读取的实际现有数据。

如何告诉套接字“嘿,我希望将X字节或更少的数据写入此缓冲区,如果您现在没有数据,可以了-在您这样做时将其交给我。何时通知我数据存储在缓冲区中?”

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

2 个答案:

答案 0 :(得分:1)

没有可用的API会在X数据可用或缓冲区读取时通知您。当任何非零数据量可用时,有一些API会取消阻止。这些API之一是epoll_wait。您需要自己在缓冲区中读取和收集X数据。

答案 1 :(得分:0)

没有Linux套接字API可以满足您的要求-即在套接字可用时执行操作。您将始终必须在代码中显式执行read

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