我正在开发一个包含两个独立服务的OS X桌面应用程序。第一个是在 C 中实现的,它在后台收集数据并将它们转发到第二个,即在 Objective C 中实现的UI。更新后,UI通过确认响应C程序,因此程序之间存在双向通信。
我目前使用TCP套接字进行进程间通信,它可以工作,但有时候套接字连接上的消息会延迟最多45秒。是否有替代机制可以在C
和Objective C
计划之间的通信之间提供高速,最小延迟?
我正在使用XCode。
答案 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更好的选择,并且它仍然是套接字接口。
您可以考虑其他替代方案,例如管道(每个方向一个),消息队列以及共享内存方法的几个变体,但是考虑到您的起点,我甚至不会考虑任何一个排除基于套接字的替代方案。