我有在 Linux 和 iPhone 上的套接字级别编写的跨平台代码。它打开非阻塞套接字并连接到服务器。一切都很好,除了有时当其中一个客户端/服务器断开连接时,它会在 recv 或 send 调用期间通过 SIGPIPE 在另一个上停止执行。
这是有道理的。在 Linux 上,我可以使用一个标志来指示操作系统库不要引发 SIGPIPE - 然后我可以自己感知错误并干净地处理它。这很好用
但是在 iPhone 操作系统(可能还有我后来关心的 osx)上,没有标志指示不抛出 SIGPIPE。我可以做信号(SIGPIPE,IGN);这似乎通常会阻止它,但有时我还是会明白??? (这可能是由于我设置信号处理的位置 - 我可能只在应用程序启动时执行此操作,而我可能必须在每次应用程序激活时执行此操作??)
这一切让我觉得我以错误的方式捕捉到断开连接 - 我应该使用 select() 还是 friend 来感知是否发生了断开连接?具体我该怎么做?
最佳答案
你真的应该用谷歌搜索那个(例如,this page)。简而言之,除了您已经尝试过的方法之外,请尝试使用 SO_NOPIPE 套接字选项。
关于iphone - 如何检测TCP连接丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4769657/