2012-01-27 11 views
1

別のプロトコル(UDT)をサポートするようにiperfを変更しようとしています。 iperfの中にこれらの呼び出しは、UDTコードの代わりにソケットを使用するように、私はその後、実行する必要がどのような、条件付きでUDTのライブラリとリンクされて実行時にリンクするライブラリを選択する

socket(...); 
    bind(...); 
    listen(...); 

:UDT APIは、それが標準BSDの呼び出しを反映するように書かれていますTCPスタックへのインタフェース。これはできますか?私はいつもライブラリをロードし、UDT :: namespaceを使って別の条件付きパスを持つことができますが、1)TCPパスからの重複が多く、2)何も必要ないかもしれない多くの変更があります。私が明確ではない場合は、私に教えてください、この動的リンクを達成するためのどのような提案が評価されます。

編集:下記のdlopen()ファミリを使用して

が、私は以下のプログラムの流れかもしれない:

は、CMDラインのparamsを解析 - > UDTが要求された場合に、ロード・ライブラリーlibudt - > 取得し、

この時点では、すべてのUDT関数で関数ポインタが格納されています。私がそれらをすべてudt_callsという構造体に格納しているとしましょう。今、私はちょうどのような呼び出しを行う既存のコードに問題がいる:

  bind(...) 

いうより:

  udt_calls->bind(...) 

は私が世界的に私とプログラム全体で任意のBSD呼び出しを無効にすることができますきれいな方法はあります今私のudt_calls構造体の関数ポインタをロード?

+0

をやったのですか? UDTを実行するパッチまたはiperfのバージョンはありますか? –

答えて

1

はいこれが可能です。動的ライブラリの読み込みを使用する必要があります。 Windowsでは、これはLoadLibraryを使用して行われます。 LinuxまたはUnixでは、dlopenと友人を使って行われます。

これらの機能については、マニュアルを読んでサンプルを見たいと思うでしょう。簡単な要約は、たくさんの関数ポインタを作成することです(しばしばstructで行われ、WindowsではC++仮想関数クラスにロードするためのいくつかのトリックがあります)。次に、動的ロード関数を使用してライブラリを開き、関数ポインタをライブラリ内の関数を指すように割り当てます。

次に、関数ポインタ(またはC++仮想関数)を使用して関数呼び出しを行います。

編集:It looks like there are ways to use C++ virtual base classes in Unix as well.

編集:私は、ほとんどのシステムは、オペレーティング・システム・ライブラリは、「弱い」の記号を使用しますと信じています。つまり、同じ名前の独自のグローバルシンボルを定義し、OSライブラリのバージョンを上書きすることができます。独自のプログラムでグローバル関数ポインタを宣言して、bindlistenのグローバルバージョンを提供してください。

別のオプションは、構造体であなたのポインタを宣言して、プリプロセッサを使用することとすることができるように定義しています。あなたは今まで、これは

#define bind udt_calls->bind 
+0

ありがとう!これはちょうど私が探しているように見えます。しかし、上記の私の編集を見ると、私はまだ事前に書かれたコードに問題があります。あなたは解決策を提案できますか? –

+0

@ agent0range:自分のプログラムでグローバル関数ポインタを宣言し、 'bind'のOSライブラリバージョンを上書きしてみてください。 –

関連する問題