关于epoll
在Win32中,如果套接字在某些IOCP下注册,并且没有可用的数据读取,则使用ReadFile
发出具有某些重叠结构的异步读取操作将返回false
,并且错误代码为WSA_IO_PENDING
。
如果有数据 可用,那么IOCP会取出相关的overlapped
,给ReadFile
的缓冲区包含新读取的数据,您可以从那里继续
关于linux和epoll,我不明白。如果您在某个epoll
对象下注册了一个套接字,但没有可用数据,则read
只会返回-1
并且errno
是EWOULDBLOCK
或EAGAIN
。我也了解监视EPOLLIN
是半满的,因为EPOLLIN
谈论能够从套接字读取,而不是要读取的实际现有数据。
如何告诉套接字“嘿,我希望将X字节或更少的数据写入此缓冲区,如果您现在没有数据,可以了-在您这样做时将其交给我。何时通知我数据存储在缓冲区中?”
使用epoll
对象是否可以像使用IOCP一样?
答案 0 :(得分:1)
没有可用的API会在X数据可用或缓冲区读取时通知您。当任何非零数据量可用时,有一些API会取消阻止。这些API之一是epoll_wait
。您需要自己在缓冲区中读取和收集X数据。
答案 1 :(得分:0)
没有Linux套接字API可以满足您的要求-即在套接字可用时执行操作。您将始终必须在代码中显式执行read
。
您能做的最好的事情就是拥有一个poll
多路复用的非阻塞IO,或者每个套接字带有一个线程的阻塞IO。