插座关闭时管道损坏

时间:2011-03-21 20:00:53

标签: c++ linux sockets

我在Linux机器上有一个服务器/客户端应用程序。如果客户端尝试发送请求时服务器未启动,我会收到SIGPIPE并终止应用程序。

在尝试编写之前,如何检查套接字上的服务器是否可用?

另外值得注意的是,我不想捕获SIGPIPE,因为客户端实际上是许多应用程序使用的共享对象的一部分,这些应用程序可能已经或可能没有定义自己的信号处理方法。

由于

2 个答案:

答案 0 :(得分:6)

MSG_NOSIGNAL作为标记传递给send()

答案 1 :(得分:0)

kroki的post描述了什么似乎是一个好方法。

总结一下:

  • 检查SIGPIPE是否有待处理。在变量中记录。如果它在我们开始之前就已经挂起,那么其他人就阻止了SIGPIPE。在这种情况下,请跳过下面的所有信号,然后进行写操作。
  • sigblock SIGPIPE。
  • 写下来。
  • 检查SIGPIPE是否有待处理。
  • 如果它正在等待,那么sigtimedwait为它没有超时。
  • 取消阻止SIGPIPE。