XCode(Objective C)和C程序之间的进程间通信

时间:2016-10-13 12:57:08

标签: objective-c c macos xcode7

我正在开发一个包含两个独立服务的OS X桌面应用程序。第一个是在 C 中实现的,它在后台收集数据并将它们转发到第二个,即在 Objective C 中实现的UI。更新后,UI通过确认响应C程序,因此程序之间存在双向通信。

我目前使用TCP套接字进行进程间通信,它可以工作,但有时候套接字连接上的消息会延迟最多45秒。是否有替代机制可以在CObjective C计划之间的通信之间提供高速,最小延迟?

我正在使用XCode。

1 个答案:

答案 0 :(得分:2)

在为完全不同的东西交换大部分工作的实现之前,值得尝试调整它以消除不必要的延迟。这样做可能就像通过setsockopt()修改套接字选项一样简单。特别是,通过设置TCP_NODELAY选项,您可能会因为在所涉及的套接字上禁用Nagle's algorithm而受益。这样做的示例代码是经过http://www.unixguide.net/network/socketfaq/2.16.shtml

的微小修改而复制的
#include <sys/socket.h>
#include <netinet/in.h>

int flag = 1;
int result = setsockopt(sock,            /* socket affected */
                        IPPROTO_TCP,     /* set option at TCP level */
                        TCP_NODELAY,     /* name of option */
                        &flag,  
                        sizeof(int));    /* length of option value */
if (result < 0)
   ... handle the error ...

尝试下一个破坏性最小的选项是切换到Unix域套接字(AF_UNIX)而不是TCP套接字。实际上,对于保证始终在同一主机上运行的两个进程之间的通信,这是一个总体上比TCP更好的选择,并且它仍然是套接字接口。

您可以考虑其他替代方案,例如管道(每个方向一个),消息队列以及共享内存方法的几个变体,但是考虑到您的起点,我甚至不会考虑任何一个排除基于套接字的替代方案。