0

我有一个用 C++ 编码的服务器,在 ubuntu 10.04 上运行,目前正在生产中,它表现出一个奇怪的错误。

语境 :

每个连接到服务器的客户端都有一个套接字和两个线程

  • 1个用于写入套接字的线程,
  • 1个用于从套接字读取的线程。

套接字配置::setsockoptSO_RCVTIMEO10 秒。

套接字上的每个都设置::send了标志MSG_NOSIGNAL(每个::recvfrom也设置了,但似乎应该没有影响)

漏洞 :

我有一些证据(但不是 100% 肯定)以下情况可能很少发生:

  • ::recvfrom被调用并阻塞,直到数据存在或达到超时
  • ::send被调用并且套接字上的写入触发错误,返回EPIPE(Broken Pipe)错误
  • 错误:::recvfrom仍然被阻止,并且永远不会返回,不知何故忽略了SO_RCVTIMEO选项

上述情况对您有意义吗?

指标:

该错误大约每周发生一次。在一周内,大约有:

  • 使用了 20K 个套接字
  • 30M::recvfrom被叫
  • 60M::send调用

我应该使用超时功能::select吗?(假设超时实现将与那个不同SO_RCVTIMEO

非常感谢您对此事的任何想法!

4

0 回答 0