2012-03-06 15 views
4

コンパイル済みC++プロセスからコンパイル済みC#プロセスに画像データを送信しようとしています。 C++プロセスは、Webカメラにアクセスして、画像に対して何らかの処理を行っています。画像は、各ピクセル値がそのピクセルのグレースケール値である8ビット値(0〜255)であるピクセルの2Dアレイによって表される。 画像のサイズは640 x 480です。C++プロセスからC#プロセスに画像を送信する

C#アプリケーションはさらに処理を行い、この画像を画面に表示します。プロセスはどちらも私のラップトップ(Windows 7 OS)上で同時に実行されていますが、すべてのステップを実行するプロセスを1つ作成することはできません。そのため、C++コードとC#コードが通信する必要があります。

私はこれを行うための最善の方法は何ですか?私は、C#部分にUDPまたはTCPサーバを記述し、C++部分にクライアントを書くと、データグラムとして画像データを送ることができます。私はこれが最善の方法であるかどうか、それがUDPかTCPの方が良いかどうか疑問に思っていましたか?

EDIT:C++プロセスはアンマネージC++であり、管理DLLとして実行するオプションはありません。名前付きパイプを使用して画像を送信できますか?

ローカルで通信している場合、最後にUDPが順番に保証されますか?私はイメージがUDPの限界を超えていることに気が付いていますが、もしそれがインオーダーであれば、イメージを分割して送信する必要があります。

+2

共有メモリが役立つかもしれない:http://stackoverflow.com/a/925272/390913 – perreal

+2

通常、信頼性が高くパケット損失を処理するため、TCPを使用することをお勧めします。しかし、あなたのケースでは、両方のアプリケーションが同じマシン上にあるので、パケットの損失はなく、どちらか一方で逃げることができます。 UDPの利点は速度です。 UDPはパケットの損失をチェックせず、TCPより高速ですので、一度に1つのイメージを送信する代わりにWebカメラからビデオをストリーミングする場合、UDPを使用してパフォーマンスが向上することがあります。 – arc

+0

可能な複製http://stackoverflow.com/questions/539908/interprocess-communication-between-c-sharp-application-and-unmanaged-c-applica –

答えて

2

プロセス間通信は、ソケットまたはパイプ経由で行うことができます。

ソケット(TCPとUDP)を使用すると、インターネット経由でデータを送信することになります。幸いなことに、あなた自身が知っているので、データはcompを離れるべきではないので、これはかなり速くすべきです。 TCPは整然としていることが保証されていて、他の素敵な機能がたくさんありますが、UDPはヘッダーをデータに叩いて、最高のものを期待しています。このアプリケーションでは、TCPは問題ありません。 UDPは不要な複雑さを追加します。

パイプは、通信する2つのプロセスを持つ別の方法です。基本的には、C++またはC#のプロセスでパイプを作成し、他のプロセスを開始します。あなたはファイルのようにパイプを使用するだけです:ファイルへの書き込みとそこからの読み取り。これは、pipe,fork、およびexec関数の組み合わせを使用するか、単にpopen関数を使用してC/C++で行うことができます。 C#にはおそらく同様の機能があります。

_popen(Windowsの場合はpopen)を使用し、一連のintをパイプに書き込み、反対側からそれを読み取ることをお勧めします。これはおそらく最も簡単な方法です...もちろん、1つの言語を使用する以外に...

+1

OPは彼が 'pipe()'、 'fork()'、 'exec()'、 'popen()'が利用できないWindows 7 OSを使用していると言います。 –

+2

Windowsでは、それぞれ 'CreatePipe'、(同等の機能はありません)、' CreateProcess'、または 'OpenProcess'関数を意味します。 –

2

あなたがプログラムの両方を作成する場合は、DLLとしてC++ 1をコンパイルし、System.Runtime.InteropServices名前空間のDLLIMPORT属性を使用してC#のプログラムからの配列または一部の構造を返す関数を呼び出すことができます。

1

なぜあなたは同じプロセスでそれを行うことができませんか? C#とC++を混在させる必要があるからですか?この場合、C++/CLIを環境間のブリッジとして使用して、.NET CLRのC#コードとC++コードの両方をネイティブに1つのプロセスにコンパイルすることができます。

本当に2つのプロセスが必要な場合は、ローカルマシンで実行するときにいくつかのオプションがありますが、おそらく小さなTCPベースのサービスが最適です。各画像のサイズは307kbになり、UDPの65kbの制限よりも大きくなります。

0

私はこれが最善の方法であるかどうか、UDPまたはTCPの方が良いかどうか疑問に思っていましたか?

TCPが十分に速くないと、パケットロスがを扱うことができないときではなく、不便であるときは、通常の速度の最適化とUDPに頼ります。あなたが送信で画像の一部を失うことに対処できないなら、あなたはUDPに頼ることができるのではないかと疑います。

また、ループバックインターフェイスを使用しているため、UDPはあなたのケースでパフォーマンスが向上する可能性は低いです。これは、すべてのTCPパケットが順序どおりに到着する可能性があり、損失がなく、TCPをさらに安価にすることを意味します。

TCPを使用してアプリケーションを作成し、後で何らかの理由で同じマシン上でプロセスが実行されないと判断した場合は、コードを変更する必要はありません。

最後に、TCPソケットは使いやすいので、マシン上でTCPの速度が十分速くなければ、TCPソケットを使用します。

は、ローカルで通信している場合、順序で保証されますか?

私の知る限り、この動作はを保証するものではありません。ほとんどの場合、ほとんどの場合動作する可能性が高くなりますが、関係するドキュメントから引用符を見つけることができない限り、私はこれを考慮しません。

名前付きパイプを使用して画像を送信できますか?

はい、名前付きパイプはソケットと非常によく似ていますが、遅いことが知られています。

0

ソケットとは別に、イメージデータをC++アプリケーションのディスクに保存し、C#アプリケーションのディスクから読み取る方法があります。もちろん、完全に書き込まれる前にファイルが読み込まれないように、ある種の読み書き同期を確実にする必要があります。

また、最終的にUDPまたはTCPを使用することに決めた場合は、RTPを使用してみてください。 RTPは、データ配信の正しい順序を保証するために、タイムスタンプの追加レイヤー(シーケンス番号付け)でUDPを使用します。プロトコルのC++実装とC#実装を見つけることができるはずです。具体的には、アプリケーションがJPEG画像を生成している場合、RTP/MJPEGストリームを介して画像を送信することができます。

関連する問題