2011-01-22 75 views
3

我有我在Linux和iPhone上的套接字级编写的跨平台代码。它打开非阻塞套接字并连接到服务器。除非有时当客户端/服务器之一断开连接,在recv或发送呼叫期间通过SIGPIPE在另一端暂停执行程序时,一切都很好。如何检测TCP连接丢失?

这很有道理。在Linux上,我可以使用一个标志来向操作系统库指示不要引发SIGPIPE - 然后我可以自己察觉错误并且干净地处理它。这工作正常

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

这一切都让我感觉像我一样是否以错误的方式捕捉断开连接 - 我应该使用select()还是朋友来检测断开连接是否已经发生?具体怎么做?

回答

1

你真的应该用Google搜索一下(例如,this page)。总之,尝试使用SO_NOPIPE套接字选项以及您已经尝试过的选项。