[英]Reading a socket asynchronously with `read` and `epoll`
關於epoll
我有些想念的地方
在Win32中,如果某個套接字在某個IOCP下注冊,並且沒有可供該套接字讀取的數據,則使用具有某些重疊結構的ReadFile
發出異步讀取操作將返回false
,錯誤代碼為WSA_IO_PENDING
。
如果有可用數據,則IOCP會取出相關的overlapped
,給ReadFile
的緩沖區包含新讀取的數據,您可以從那里繼續。
當涉及到Linux和epoll時,我不明白。 如果您在某個epoll
對象下注冊了一個套接字並且沒有可用數據,則read
只會返回-1
而errno
是EWOULDBLOCK
或EAGAIN
。 我還了解監視EPOLLIN
是半幫助的,因為EPOLLIN
談論能夠從套接字讀取,而不是要讀取的實際現有數據。
怎么能告訴套接字“嘿,我希望將X字節或更少的數據寫入此緩沖區,如果您現在沒有數據,可以了-在您這樣做時將其交給我。當數據到達時通知我存儲在緩沖區中?
epoll
對象是否可能與IOCP一樣?
沒有API會在X數據可用或緩沖區讀取為您時通知您。 當任何非零數據量可用時,有一些API會解除阻止 。 這些API之一是epoll_wait
。 您將需要自己在緩沖區中讀取和收集X數據。
沒有Linux套接字API可以滿足您的要求-即在套接字可用時執行操作。 您將始終必須在代碼中顯式執行read
。
最好的辦法是使非阻塞IO具有poll
多路復用,或者使阻塞IO每個套接字具有一個線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.