Windowsのデスクトップアプリケーションで同じマシン上の別のプロセスと通信しているZeroMQについては、zmq_ipcはサポートされていません(zmq_ipc(7)参照)。少なくとも、それは私が聞いた最後のものです。これは、Windowsの名前付きパイプではselect()やepoll()のようなものを実装するのは基本的に不可能なためです。代わりにzmq_tcpを使用してください。
同じ基本的な問題は、Cygwinとその派生物におけるselect()実装の開発に悩まされました。彼らは、ソケット以外のファイルディスクリプタ(すなわち、名前付きパイプ、シリアルポートなど)が選択されているスレッドを開始することによって問題を解決しました。各スレッドは、データが到着したかどうか(またはselect ())。あまり効率的ではありません。 Yeurk。原子炉対
Proactor Windowsは(のみproactorを行うことができます)proactorある
、他のすべて(の* nix、VxWorksのは()もproactorを実装するために使用することができます)反応器です。 C++用のboost.asioライブラリの開発は、これの影響を受けていたため、Windows上で実行できるようにするためのプロアクト設計となっています。 RabbitMQもプロアクターです。
zmq_poll()は、反応炉です。
Proactor - 非同期ルーチンを積極的に起動して、今後登場するものを処理します。
リアクタ - データがすでに存在するため、非常に迅速に完了することを知っているルーチンを同期させるために、同期呼び出しを開始することによって、何が到着したかに反応します。
違いがあります。プロアクターの設計では、非同期ルーチンを起動してメッセージを読むと、(簡単に)メッセージを停止したり、変更したりすることはできません。たとえば、どこかからメッセージを読んだ結果など、気が変わった場合は非常に迷惑です。
小さな警告 - Windowsはネットワークソケット用のselect()をサポートしています(したがって、ネットワークソケットではリアクタプログラミングが可能ですが、ネットワークソケットのみ).ZMQがWindows上のどの程度でもサポートされているのは唯一の理由です。デスクトップアプリケーションイベントコールバック
でZMQをミキシング
はとにかく、proactorは、WindowsとC#は基本的にすべてがコールバックによって提供されることを期待していることを意味します。これは基本的に、GUIイベントを処理するコールバックもある場合、新しいメッセージが到着したかどうかを伝えるためにzmq_poll()コールを使用しないことを意味します。代わりに、zmq_revcmsg()への非同期呼び出しを行う可能性が最も高いでしょう。コールバックと一緒にzmq_poll()を混ぜようとすると、トラブルを尋ねています(あなたはプロクターとリアクターをブレンドしています)。
メッセージフォーマット
ZeroMQ及びソケット(ソケットのバイトストリームとしてZeroMQ有する離散メッセージなど)の両方転送バイト。アプリケーションにとってバイトが何を意味するのかを決定する課題は依然としてあります。
Googleプロトコルバッファのようなものを使用して、メッセージをZeroMQで転送するようにシリアル化することをお勧めします。これはC#とJavaの両方で使用できますが、メッセージの境界を区切りません。幸いにも、ZeroMQはそうです。 [GPBをソケットストリームで使用すると痛いことがあります。メッセージの境界を明確にする必要があります。したがって、バッファにメッセージをシリアライズし、バッファとしてZeroMQにメッセージとして渡すことができます。受信者はメッセージを受信し、1つの単一の孤立GPBがあることを絶対に知ることができます。あなたが好きなら、GPBの「oneof」を使って任意のメッセージタイプを密輸することができます。これは非常に解放的です。他のシリアライゼーション技術でも同じことを達成できます。私の個人的な好みはASN.1です。
https://github.com/zeromq/jeromqに出会ったのですか?しかし、それを使用していない。 – Fildor
ZeroMQは、ソケットを使用するメッセージキューです。 RabbitMQは別の方法であり、他にもあります。 http://stackoverflow.com/questions/731233/activemq-or-rabbitmq-or-zeromq-or –
こんにちはFidor、私はこれを見た、それはzeroMQのJavaの実装です。しかし、私のネイティブレイヤーはC#で書かれているので、Javaで書かれたソケットアプリケーションと通信するにはC#dllも必要です。私は3番目と5番目のポイントと混乱している、私は質問で述べた –