如何检测TCP连接丢失?

时间:2011-01-22 18:22:02

标签: iphone linux sockets posix

我有跨平台代码我在Linux和iPhone上的套接字级别编写。它打开非阻塞套接字并连接到服务器。一切都很好,除非有时当客户端/服务器中的一个断开连接时,它会在recv或send调用期间通过SIGPIPE在另一个上停止执行。

这是有道理的。在Linux上,我可以使用一个标志来指示OS lib不要引发SIGPIPE - 然后我可以自己感知错误并干净地处理它。这很好用

然而,在iPhone OS上(可能是我后来关心的osx),没有标志表明不会抛出SIGPIPE。我可以做信号(SIGPIPE,IGN);这似乎通常会阻止它,但有时我仍然得到它? (这可能是由于我设置信号处理的位置 - 我可能只在应用程序启动时执行此操作而我可能必须在每次应用程序变为活动时执行此操作?)

这一切让我觉得我正在以错误的方式捕捉断开连接 - 我应该使用select()或朋友来感知是否发生断开连接?具体来说我该怎么做?

1 个答案:

答案 0 :(得分:1)

你真的应该用Google搜索(例如,this page)。简而言之,除了您已尝试过的之外,请尝试使用SO_NOPIPE套接字选项。