// これは何? 他のBonDriverへTCP越しにプロキシ接続するだけのツールです。 当方Spinel使った事は無いのですが、機能の少ないSpinelみたいなもんかなと思ってます。 とりあえず軽くシンプルにを目的としてつくりましたが、それが上手く行ってるかどうかは使う方の判断で…。 複数のクライアントからの要求BonDriverが同じだった場合にBonDriverのインスタンス及びそこからのTSストリームが 共有される事と、チャンネルロック権の設定以外は複雑な機能は何も持っていません。 TSのデスクランブルとかその手の機能は一切なしで、接続先のBonDriverやこのツールを利用するアプリ(TVTestとか)に 丸投げです。 #最初はインスタンスの共有周りも重くなりそうだしやめようかと思ってたんですが、試しにつくってみたら意外と #大丈夫だったので組み込む事にしました 当方の用途としては、基本的には録画用マシンでptTimer使って録画しかしてないけど、たまにリアルタイムで 視聴したいって時用に使ってます。 使い方はごく単純に、 1. BonDriver_Proxy.dllを、これを利用するアプリ用のBonDriver設置場所にコピー 2. BonDriverProxy.exeを、利用するBonDriverがあるマシン上(以下サーバ側)の適当な場所に設置 3. BonDriver_Proxy.iniにサーバ側のアドレスとポート番号及びサーバ側で読み込むBonDriverを指定 4. 3でつくったiniファイルをBonDriver_Proxy.dllと同じ場所に設置 5. 3でつくったiniファイルのコピーをBonDriverProxy.iniに名前を変えてサーバ側のBonDriverProxy.exeと同じ場所に設置 です。 例えばクライアントアプリがTVTest、サーバのアドレスが192.168.0.100で、使いたいポートが1192、 C:\BonDriverProxyにBonDriverProxy.exeと使いたいBonDriver(例としてBonDriver_ptmr.dll)を 設置するとすると、 // iniファイルの内容 -------------------------------------------------------------------------------- [OPTION] ADDRESS=192.168.0.100 PORT=1192 BONDRIVER=BonDriver_ptmr.dll CHANNEL_LOCK=0 -------------------------------------------------------------------------------- // サーバ側フォルダC:\BonDriverProxyの内容 -------------------------------------------------------------------------------- BonDriverProxy.exe BonDriverProxy.ini <- 上記iniファイルのコピー BonDriver_ptmr.dll -------------------------------------------------------------------------------- // クライアント側TVTestのフォルダにコピーするもの -------------------------------------------------------------------------------- BonDriver_Proxy.dll BonDriver_Proxy.ini <- 同じく上記iniファイルのコピー -------------------------------------------------------------------------------- となります。 この状態で、サーバ側でBonDriverProxy.exeを起動しておき、クライアント側でTVTestを起動して BonDriver_Proxyを選択すればOKです。 #ちなみにあんまり用途を思い付きませんが、サーバ側BonDriverとしてBonDriver_Proxy.dllを指定して #多段接続する事も可能です ##なおこの時、サーバ側のBonDriver_Proxy.dllの接続先にも同じサーバが指定され、要求BonDriverも ##自分自身だった場合、恐らく酷い事になります(棒) ##一応要求BonDriver名が「BonDriver_Proxy」で始まっていた場合のみ救済措置を入れてます(´Д`) iniファイルのCHANNEL_LOCKの値は、1ならチャンネル変更の優先権あり、0なら優先権を持っているユーザが 接続していない場合に限り変更権ありです。なお、優先権ありのユーザ同士及びなしのユーザ同士は対等です。 使いたいBonDriverの指定はフルパス指定(もちろんサーバ側の)でも大丈夫です。 ただし、セキュリティの関係上UNCパスは設定できません。 #設定されたファイル名をそのままLoadLibraryA()に渡してるので インスタンスの共有を行うかどうかは単純にBONDRIVERに指定している値で決めています。 なので、実体は同じファイルであってもパスの指定方法が異なっていると別のBonDriverの要求と判断されます。 例えば上記設定例で言うと「BonDriver_ptmr.dll」と「C:\BonDriverProxy\BonDriver_ptmr.dll」の様な場合です。 この場合にどうなるかは対象BonDriver次第ですが、大抵のBonDriverは同一プロセスからの複数のインスタンス作成は 保証されていない様です。BonDriver_ptmr.dllの様に許可されないのはむしろ良い方でしょう。 なので、この様な状態は運用で回避して貰えればと思います。 別の複数のBonDriverを使いたい時は、クライアント側のBonDriver_Proxy.dllとBonDriver_Proxy.iniをコピーして、 名前とiniファイルのBONDRIVERの指定を書き換えてください。 (サーバ側のiniファイルはアドレスとポート番号しか参照していないので、そちらはそのままで大丈夫です) 注意点としては、BonDriverProxy.exeは読み込みたいBonDriverがx86の物ならx86版を、x64の物ならx64版を 使用する必要があります。 もっとも通信プロトコルは共通なので、クライアントはx64のTVTest、使用したいのはBonDriver_ptmr.dll(現時点では x86の物しか提供されていません)と言う様な構成でも、x64版のBonDriver_Proxy.dllとx86版のBonDriverProxy.exeを 使用すれば通信できます。 もちろん使用するBonDriver側に制限や必須事項がある場合はそのまま影響を受けるので、その辺は適宜対応してください。 例えばBonDriver_PT3-XX.dllにはPT3Ctrl.exeが必要とか、その手の話です。 なお、BonDriverProxy.exeは実行しても何の表示も行わないので、終了する時はタスクマネージャ等から 殺してください。 #Debugビルドではウインドウをつくるようにしてるので、何か表示が欲しい方はその辺いじって #Releaseビルドでもそうなる様にしてビルドし直せば良いかもしれません。 また、BonDriverProxy.exeのサービス登録は、必要性をあまり感じなかったので実装していません。 必要な方はscコマンドなり何なりで登録すれば良いかと思います。 // ライセンス MITライセンスとします。 Copyright (c) 2014 unknown もちろんモロモロ無保証です。 // 謝辞 拡張ツール中の人さんのIBonDriver*.hをincludeさせていただいています。 また、y.mさんのRemoteTunerを参考にさせていただきました。 この場でお礼申し上げます。 もちろんTVTestやptTimer等、素晴らしいソフトの開発者様方にもお礼申し上げます。 と言う様な感じです。 なお、インスタンスの共有とチャンネルロック周りは最後に追加で半日でつくったやっつけですし、 クライアントアプリはTVTest 0.8.2でしかテストしていないので、おそらくテスト不足です。 バグ等見つけたら報告していただければと思います。 対応するかどうかはその時のやる気次第ですが(´Д`) May/31/2014 unknown <unknown_@live.jp> // 更新履歴 version 1.1.4.1 (Jul/04/2014) ・サーバ側のグローバルなインスタンスロック処理を厳密に行うのをデフォルトにした 副作用として、サーバプロセスがBonDriver_Proxyをロードし、それが自分自身に再帰接続(直接ではなく、それ以降の プロキシチェーンのどこかからでも同じ)するような状況ではデッドロックする ただし、テスト用途以外でその様な使用方法が必要になる状況は多分存在しないので、まず問題になる事は無いハズ 一応、コンパイル時にSTRICT_LOCKが定義されているかどうかで変更可能なので、以前の動作に戻したい場合は、 BonDriverProxy.cppの頭の方にある#defineをコメントアウトすれば良い ・可能性はごく低いが理論的にはあり得るメモリリークへの対策を追加 ・クライアント側のIBonDriver2の方のSetChannel()で、リクエストされたスペース/チャンネルと、現在保持している スペース/チャンネルとの比較処理を廃止 #他のクライアントのチャンネル変更に引きずられた場合、実際のスペース/チャンネルと保持しているスペース/ #チャンネルにズレが生じる為 version 1.1.4.0 (Jul/02/2014) ・サーバ側のTSストリーム配信時のロック処理をロードしたBonDriverのインスタンス毎にグループ分けした これにより、グローバルなインスタンスリストのロックや他のBonDriverインスタンスのTSストリーム配信処理の影響を 受けなくなるのと、個々のクライアントへのTSパケット作成時にロック及び比較処理が不要になる ・version 1.1.3.1への対応時に、変更すべき箇所が変更されていなかったのを修正 version 1.1.3.1 (Jul/01/2014) ・BonDriver_Proxyの各種BonDriverAPIを複数スレッドから非同期で呼び出された場合、理論的にはあるコマンドへの レスポンスを他のコマンドへのレスポンスと取り違える可能性があったのに対応 #実際にそのような呼び出し方をするアプリが存在するかどうかはわからないが、対応しておいても損は無さそうなので… version 1.1.3.0 (Jun/21/2014) ・クライアント側にサーバへの接続タイムアウトの指定を出来る機能を追加 #iniのCONNECT_TIMEOUTで指定(単位は秒) ・ついでにWOLのパケット自動送信機能を追加 #使い方に難しい点は無いと思うのでSample.ini参照。TARGET_MACADDRESSは必須だが、TARGET_ADDRESS及び #TARGET_PORT行に関しては、無い場合はOPTIONの方のADDRESSとPORTをそれぞれ使用する。 #なお、TARGET_PORTはUDPのポートである事に注意。 ・サーバ側は機能的な変更は無し version 1.1.2.0 (Jun/19/2014) ・SetChannel()内で、GetTsStream()でアプリに返したバッファを解放してしまうBonDriverを読み込んだ場合、 タイミングが悪いと解放後メモリにアクセスしてしまう可能性があったのに対応 ・BonDriver_Proxy.dll自身もプロキシ対象のBonDriverからのレスポンスをサーバから受け取ってからではあるものの 上記の状態だったので、アプリに返したバッファは必須の時以外解放しないように修正 ・その他ソースコードのtypo修正及びロジックは(ほぼ)変更無しでの整形 version 1.1.1.0 (Jun/04/2014) ・GetSignalLevel()が遅いBonDriverを読み込んだ場合、TS用に指定したバッファサイズ次第(小さすぎる場合)では、 ノーウェイトでGetTsStream()を繰り返してもそのBonDriver内でTSバッファ破棄が発生する場合があったのに対応 #GetSignalLevel()はTS用パケット作成時毎回ではなく、定期的に呼び出してその値を保持しておく、 #つまり、TVTest 0.8.2と同じ方式にした。 ・iniでパケット用及びTS用のキューのサイズとTS用のバッファサイズを指定出来るようにした #無指定の場合のデフォルト値はそれぞれ、16、32、192512。 #指定する場合は少なくともTS用のバッファサイズはサーバ側とクライアント側とで同じ値を使用するべき。 #TS用のバッファサイズは188の倍数が無難。小さすぎると上述の様な問題の発生や、各種オーバヘッドが #大きくなるだけなので、48128以上推奨。 ・BonDriver_Proxy.dllに指定BonDriverを変更できるAPI追加 #BonDriver_Proxy.dllは複数のインスタンス作成を許可している為、インスタンス作成前に指定BonDriverを #変更する事によってBonDriver_Proxy.dllのコピーを作成する必要が無くなるハズ。 ##ただしアプリ側が対応しないとダメなので、正直意味無い気も。 version 1.1.0.0 (May/31/2014) ・初版リリース