別のプロトコル (UDT) をサポートするようにiperfを変更しようとしています。UDT API は、標準の BSD 呼び出しを反映するように記述されています。
socket(...);
bind(...);
listen(...);
次に、UDT ライブラリと条件付きでリンクして、iperf のこれらの呼び出しが TCP スタックへのソケット インターフェイスの代わりに UDT コードを使用するようにする必要があります。これはできますか?私はいつでもライブラリをロードし、UDT:: 名前空間を使用して別の条件付きパスを持つことができますが、1) TCP パスからの重複が多く、2) 変更が必要ない場所で多くの変更が行われる可能性があります。明確でない場合はお知らせください。この動的リンクを実現する方法についての提案をお待ちしております。
編集:
以下で説明する dlopen() ファミリを使用すると、次のプログラム フローを作成できます。
cmd line params を解析 -> UDT が要求された場合、ライブラリ libudt をロード -> すべての UDT BSD 関数 (bind、listen など) のハンドルを取得して保存
この時点で、すべての UDT 関数と共に関数ポインターが格納されています。それらすべてを udt_calls という構造体に格納しているとしましょう。今、次のような呼び出しを行う既存のコードに問題があります。
bind(...)
それよりも:
udt_calls->bind(...)
udt_calls 構造体にロードされた関数ポインターを使用して、プログラム全体で BSD 呼び出しをグローバルにオーバーライドできるクリーンな方法はありますか?