2016-10-13 47 views
0

私は2つの別々のサービスからなるOS Xデスクトップアプリケーションを開発中です。 Cで実装された最初のものは、バックグラウンドでデータを収集し、で実装されたUI(Objective C)の2番目のUIにリレーします。更新後、UIはCプログラムに応答して応答し、プログラム間の双方向通信が行われます。XCode(Objective C)とCプログラム間のプロセス間通信

現在、プロセス間通信にTCPソケットを使用していますが、動作しますが、ソケット接続全体のメッセージが最大45秒遅れることがあります。私のCObjective Cプログラム間の通信の間に、高速、最小待ち時間を提供する代替メカニズムがありますか?

私はXCodeを使用しています。

+1

「より良い」という定義に依存します。確かに、UNIXドメインソケット、共有メモリ、パイプなどに有利な議論があります。どのような機能について気にしていますか? (つまり、1つの方法を測定して別のものより「良い」方法を測定するメトリックは何ですか?) –

+0

クロスプラットフォームソフトウェアで動作するnotifier.A通知機能が必要です。Cサービスで何らかの変更が発生すると、目的Cがそれを受け取るUI。私はソケットを使ってこれをやっています。 –

+0

@サイマルラは、IPCメカニズムのどの特性が、他のものよりも優れているかどうかを判断する上で重要であるとは言いません。もし私があなたを正しく理解すれば、あなたはすでに作品を持っているので、何らかの形でそれに不満はありますか? –

答えて

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ソケットに切り替えることであろうしようとする次の最も破壊オプション。実際、常に同じホスト上で動作することが保証されている2つのプロセス間の通信では、これはTCPよりも全体的に優れた選択肢であり、依然としてソケットインターフェイスです。

パイプ(各方向に1つ)、メッセージキュー、共有メモリのアプローチに関するいくつかのバリエーションなどの他の選択肢がありますが、出発点を考えれば、最初にソケットベースの代替案を除外します。

+0

ありがとうございます。 –

関連する問題