我正在开发一个包含两个独立服务的 OS X 桌面应用程序。第一个在 C 中实现,在后台收集数据并将它们转发给第二个,一个在 Objective C 中实现的 UI。更新后,UI向C程序响应一个确认,程序之间存在双向通信。
我目前使用 TCP 套接字进行进程间通信,它可以正常工作,但有时通过套接字连接的消息最多会延迟 45 秒。是否有替代机制可以在我的 C
和 Objective C
程序之间提供高速、最小延迟的通信?
我正在使用 XCode。
最佳答案
在用完全不同的东西换掉你的主要工作实现之前,值得尝试调整它以消除不必要的延迟。这样做可能就像通过 setsockopt()
修改套接字选项一样简单。特别是,听起来您可能会从禁用 Nagle's algorithm 中受益。在涉及的套接字上,通过设置 TCP_NODELAY
选项。此示例代码是从 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 更好的选择,而且它仍然是一个套接字接口(interface)。
您还可以考虑其他替代方案,例如管道(每个方向一个)、消息队列和共享内存方法的几种变体,但鉴于您的出发点,我什至不会考虑其中任何一个排除基于套接字的替代方案。
关于objective-c - XCode(Objective C)和C程序之间的进程间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40021683/