send,recvfrom,threads," Broken Pipe"和SO_RCVTIMEO错误

时间:2012-06-14 17:50:22

标签: c multithreading send recv epipe

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

背景:

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

  • 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之一不同)

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

0 个答案:

没有答案