我在ubuntu 10.04上运行了一个用C ++编码的服务器,目前正在制作中,它表现出一个奇怪的错误。
连接到服务器的每个客户端都有一个套接字和2个线程
套接字通过::setsockopt
配置,SO_RCVTIMEO
为10秒。
套接字上的每个::send
都设置了标志MSG_NOSIGNAL
(每个::recvfrom
也是,但似乎它应该没有影响)
我有一些证据(但不是100%肯定)可能很少发生以下情况:
::recvfrom
被调用并阻塞,直到存在数据或达到超时::send
并且套接字上的写入触发错误,返回EPIPE
(Broken Pipe)错误::recvfrom
仍然被阻止,永远不会返回,不知何故忽略SO_RCVTIMEO
选项以上情况对您有意义吗?
这个错误几乎每周都会发生。在一周内,有近似的结论:
::recvfrom
名为::send
致电我应该使用::select
的超时功能吗? (假设超时实现与SO_RCVTIMEO
之一不同)
非常感谢你对此事的任何想法!