将套接字与 NSXPCConnection 一起使用

Posted

技术标签:

【中文标题】将套接字与 NSXPCConnection 一起使用【英文标题】:Using Sockets with NSXPCConnection 【发布时间】:2015-01-06 20:18:27 【问题描述】:

在使用带有 NSXPCConnection 的套接字时遇到问题。

基本上,有一个主进程和一个辅助进程在运行,通过 NSXPCConnection 建立。该辅助进程需要充当服务器并侦听特定端口(例如 111),该端口接收外部连接。

助手进程使用 Apple 提供的 TCPServer 助手类(CFSocket 的包装器)打开一个监听套接字。代码在这里找到: https://code.google.com/p/iphone-remotepad/source/browse/trunk/RemotePad/TCPServer.h?r=238

套接字在- (BOOL)start:(NSError **)error中打开成功。

外部客户端可以通过 111 端口建立。 (通过telnet localhost 111 在终端中测试)。

但是,辅助进程永远不会收到 TCPServer 回调 TCPServerAcceptCallBack

帮助进程启用了com.apple.security.network.client 授权。

另外,当我在主应用程序而不是辅助进程中运行 TCPServer 时,在端口 111 上设置服务器,并尝试连接到端口 111,我确实收到了回调。

关于为什么辅助进程没有收到套接字回调的任何想法? XPC 相关问题?

【问题讨论】:

【参考方案1】:

好的,问题解决了。

xpc 服务为您提供类型为 dispatch_main 的默认运行循环。

您想用 NSRunLoop 替换它 - 通过更改 xpc 服务信息 plist 来完成:

https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html

完成后,您想在 xpc 服务中手动创建一个运行循环,如下所示:

do 
    @autoreleasepool 
        [[NSRunLoop currentRunLoop]run];
    
 while (YES);

设置完成后,TCPServer(需要一个活动的运行循环)将返回回调,您将能够获取传入的数据。

【讨论】:

以上是关于将套接字与 NSXPCConnection 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

NSXPCConnection 调试中断/失效

通过 NSXPCConnection 传递 xpc_object_t

将 Python xmlrpclib 与 unix 域套接字一起使用?

将 recvfrom() 与原始套接字一起使用:一般疑问

将密码与套接字 java 一起使用,不起作用

从 NSXPCConnection 传递非空参数时未调用应用回复