我在 macOS 应用程序中使用 Unix 域套接字,但我的 CFSocketRef 在某些时候变得陈旧,然后在任何调用时崩溃。任何解决方案?

I am using Unix Domain sockets in a macOS application, but my CFSocketRef at some point becomes stale, then crashes on any call. Any solution?

我在 Objective-C macOS 项目中使用 Unix 域套接字,使用 this 非常好的答案。答案提供了完整的class搭建socket客户端和服务端。目前我只对客户端功能感兴趣。通信运行良好,但在短时间后 CFSocketRef 变得陈旧,并且在有可用数据时不再触发回调函数。对 CFSocketRef 上的任何函数的任何后续调用都会导致崩溃,例如:

return (BOOL)CFSocketIsValid( self.sockRef );

崩溃日志说:

Expected typeID 61 (CFSocket) does not match actual typeID 0 (<unknown>)

我试过这样更新代码:

CFTypeID typeID = CFGetTypeID(self.sockRef);

if (typeID != 61) {
    NSLog(@"Here we are.");
}

通常情况下,类型为 61 并且可以正常工作,但在变得陈旧之后,它会在调用 CFGetTypeID 时崩溃。我在 Core Foundation 方面不是很有经验,有经验的人可以向我建议调试策略或解决方案吗?非常感谢

我找不到问题中描述的崩溃的解释,但我改变了方法,我发现 CocoaAsyncSocket 也可以用作 Unix 域套接字连接的包装器,它也来自带有一个名为 DomainTest 的完整示例。我强烈建议使用它来避免直接调用 CoreFoundation 调用,因为它是一个出色的库,具有公认的稳定性。我现在已经在我的项目中使用了它,并且没有再发生崩溃。感谢您的关注。

编辑:

我从 Chilkat software, which is a paid library. They have very good examples like this, that perfectly fits my purpose. You can find more information about their CkoSocket class here 中发现了另一个很好的解决方案。再次感谢您的关注。