我有一个用 C++ 编码的服务器,在 ubuntu 10.04 上运行,目前正在生产中,它表现出一个奇怪的错误。
语境 :
每个连接到服务器的客户端都有一个套接字和两个线程
- 1个用于写入套接字的线程,
- 1个用于从套接字读取的线程。
套接字配置::setsockopt
为SO_RCVTIMEO
10 秒。
套接字上的每个都设置::send
了标志MSG_NOSIGNAL
(每个::recvfrom
也设置了,但似乎应该没有影响)
漏洞 :
我有一些证据(但不是 100% 肯定)以下情况可能很少发生:
::recvfrom
被调用并阻塞,直到数据存在或达到超时::send
被调用并且套接字上的写入触发错误,返回EPIPE
(Broken Pipe)错误- 错误:
::recvfrom
仍然被阻止,并且永远不会返回,不知何故忽略了SO_RCVTIMEO
选项
上述情况对您有意义吗?
指标:
该错误大约每周发生一次。在一周内,大约有:
- 使用了 20K 个套接字
- 30M
::recvfrom
被叫 - 60M
::send
调用
我应该使用超时功能::select
吗?(假设超时实现将与那个不同SO_RCVTIMEO
)
非常感谢您对此事的任何想法!