これは、私が ZeroMQ メーリング リストに送信した投稿のコピーです。ただし、問題は ZeroMQ に固有のものではなく、より一般的には、WinRT に対してコンパイルするときに C++ コードのより通常の「バークレー ソケット ファサード」を提供するために、WinRT で提供されるネットワーク機能上の「マッピング」レイヤーの必要性に関するものです。
こんにちは、以前、iPhone および Android バージョンのモバイル アプリ ( http://www.ibuzzedfirst.comを参照)で ZeroMQ を使用しました。これらのプラットフォームはネイティブ/C++/Socket 開発をサポートしているため、ZeroMQ です。
WindowsPhone 7.5 (OS 7.1) バージョンでは、必要な ZeroMQ 機能をゼロから再実装する必要がありました。WinPhone 7.5 は C++ ではなく C# のみをサポートするためです (実質的には C# Silverlight アプリです)。また、WinPhone 7.5 は、関数の非同期バージョンのみをサポートする独自の「バージョン」のソケット サポート ( http://msdn.microsoft.com/en-us/library/sb27wehh%28v=vs.95%29.aspx ) のみを提供します。たとえば、ConnectAsync、SendAync、ReceiveAsync などです。ただし、C++ がないため、これは論点になりませんでした。
そのため、WindowsPhone 7.5 バージョンでは、アプリを「クライアント」(競技者) 機能のみに制限し、「サーバー」(クイズ マスター) 部分を実装しませんでした。これは、サーバーが ZeroMQ 固有のマルチスレッド マルチユーザー機能を利用しているのに対し、アプリのクライアント部分はサーバーに対して要求、応答、およびサブスクリプションのみを送受信するためです。クライアントが使用する ZeroMQ トランスポート プロトコル/ヘッダーを再作成し、WindowsPhone Socket サポートを使用して通信を提供するのは (比較的) 簡単でした。
わかりました。現在、アプリを Windows 8 の WinRT に移植することを検討しています (デスクトップ/タブレット バージョンが最初です。Windows Phone 8 RT SDK はまだリリースされていませんが、同様のものになる予定です)。良いニュースは、C++ が WinRT でサポートされていることです。(実際には、まだそれほど単純ではありません。C# のみの WinRT アプリを作成する場合は、「AnyCPU」用にコンパイルできます。C++ の部分を含めるとすぐに、3 つの異なるバージョン (x86/Win32、x64、およびARM バージョンですが、それは別の問題です)。
残念ながら、Windows 7/8 Phone と同様に、WinRT は「通常の」Berkeley Socket アクセスをサポートしていませんが、代わりに独自の「バージョン」の Socket プログラミングを提供し、さまざまなソケット シナリオ用の個別のクラスを提供します。たとえば、TCP クライアント接続用の StreamSocket ( http ://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.sockets.streamsocket.aspx#methods )、バインド可能な TCP サーバーの StreamSocketListener ( http://msdn.microsoft.com/en -us/library/windows/apps/windows.networking.sockets.streamsocketlistener.aspx#methods )、および UDP バージョンの DatagramSocket / DatagramSocketListener 。さらに、すべてのメソッドの非同期バージョンのみが提供されます。
したがって、ZeroMQ を WinRT で正常にコンパイルするには、Berkeley Socket のような C++ インターフェイスを提供する Facade レイヤーを記述し、その下で WinRT が提供する Socket プログラミングのバージョンへの必要なマッピングを実行する必要があります。 .
他の誰かがこの旅を始めた、または同様のファサードを書いたことがありますか? 特に WinRT は非常に「大きなもの」を目指しているので、皆さんの意見を聞くことに興味があります。