gpt4 book ai didi

c - epoll epollin 读取数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:43 28 4
gpt4 key购买 nike

在我接受设置为监听 EPOLLIN 事件的连接套接字后使用 epoll,并且我收到一个 EPOLLIN 事件,我是否必须读取所有数据( until 0) 在我epoll_ctl之前只EPOLLOUT?

示例:我有一个使用 epoll 的 HTTP 服务器,我只想读取(EPOLLINrecv)HTTP header ,直到 \r\n\r\n。我可以安全地忽略消息的其余部分而不阅读它并切换到输出(EPOLLOUTsend)吗?

最佳答案

简短的回答是肯定的,它很安全。一些事情。

“读取所有数据直到 0”的替代方案实际上无论如何都行不通。浏览器客户端在使用服务器返回的响应之前不会关闭/关闭其套接字端。所以你会停止等待 recv 返回 0,因为远程客户端仍在等待你响应。

假设您没有使用边沿触发模式,您应该没问题,不必担心错过任何通知。您可以仅使用带有 EPOLLIN 通知和 recv() 的 header ,然后 epoll_ctl 套接字以仅接收 EPOLLOUT 通知。当你发送完响应后,安全的做法是切换回监听 EPOLLIN 通知(可能还有 EPOLLHUP 和 EPOLLRDHUP)以消耗请求中的任何额外数据,直到客户端关闭他的套接字(在这种情况下 recv 将返回 0 ).

也可以使用边沿触发模式。只要确保使用非阻塞套接字并在切换到响应模式时尝试非阻塞发送,即使您没有获得初始 EPOLLOUT。当切换回阅读模式时,执行非阻塞 recv 以防丢失较早的 EPOLLIN。

如果一个愚蠢的客户端试图发送的不仅仅是 header (比如一长串 POST 数据字节),那么客户端在完成发送之前可能不会尝试接收响应。这样你就陷入了一个虚拟的僵局。服务器和客户端都不能向它们的套接字写入额外的字节,因为双方都没有读取。简单的解决方案是确保您在发送响应之前使用了整个请求( header 和“Content-Length”字节)。

关于c - epoll epollin 读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9781659/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com