使用 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 -1
而 errno
是 EWOULDBLOCK
或 EAGAIN
。我也明白监控 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 数据。
谈到 epoll
在 Win32 中,如果套接字在某些 IOCP 下注册并且没有数据可供套接字读取,则使用 ReadFile
和某些重叠结构发出异步读取操作将 return false
错误代码为 WSA_IO_PENDING
.
当数据可用时,IOCP取出相关的overlapped
,给ReadFile
的缓冲区包含新读取的数据和你可以从那里继续。
说到linux和epoll,我就不明白了。如果你在某个 epoll
对象下注册了一个套接字并且没有数据可用,read
将只是 return -1
而 errno
是 EWOULDBLOCK
或 EAGAIN
。我也明白监控 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 数据。