首页 > 解决方案 > 从服务器端关闭客户端套接字的问题

问题描述

我目前正在开发 Web 服务器 http 项目。当我用 ctrl c 停止攻城压力测试时,我注意到了一些东西。我正在使用 Epoll 进行多路复用。

  1. 我通过 epoll 收到 EPOLLIN 事件的客户端套接字(假设 fd = 6)在接收后返回 0。

  2. 发生这种情况时,我考虑到出了问题,关闭了客户袜子 (6)。

  3. 在此之后,我遇到了与前一个套接字客户端 (6) 相关的套接字服务器(假设 fd = 5)上的新请求的问题。

  4. 如果我收到关于它的请求,我将接受新连接并获得一个新的客户端 sock(假设是 7,但它可能是 6,因为我关闭了前一个)。

  5. 我将在客户端 sock 7 上设置并接收事件 EPOLLIN。我将阅读其中的内容并找到来自 siege 的旧请求。

  6. 我会响应这个请求,但在发送时会收到一个 broken_pipe 信号。

  7. 套接字服务器 (5) 将无法接收任何其他请求。

看起来它可能与 SIGPIPE 有关,我们 SIG_IGN 它,但它仍然不起作用。看起来插座坏了。

有没有人知道发生了什么?

我可以提供我可能忘记的任何其他信息。

谢谢

标签: c++socketstcpepoll

解决方案


推荐阅读