Skip to content

u-n-k-n-o-w-n/BonDriverProxy

Repository files navigation

// これは何?
他の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の値はチャンネル変更の優先度を表す0~255の数値で、大きな値ほど高い優先度になります。
自分より優先度の高いユーザが同じBonDriverを要求して接続している場合にはチャンネル変更できなくなります。
値が同じユーザ同士は対等ですが、255の場合のみは先行優先の排他ロックになります。

使いたい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ライセンスとします。
LICENSE.txt参照。

// 謝辞
拡張ツール中の人さんのIBonDriver*.hをincludeさせていただいています。
また、y.mさんのRemoteTunerを参考にさせていただきました。
この場でお礼申し上げます。
もちろんTVTestやptTimer等、素晴らしいソフトの開発者様方にもお礼申し上げます。


と言う様な感じです。
なお、インスタンスの共有とチャンネルロック周りは最後に追加で半日でつくったやっつけですし、
クライアントアプリはTVTest 0.8.2でしかテストしていないので、おそらくテスト不足です。
バグ等見つけたら報告していただければと思います。
対応するかどうかはその時のやる気次第ですが(´Д`)

May/31/2014 unknown <[email protected]>

// 更新履歴
version 1.1.6.5 (Aug/07/2016)
	・サーバ側にクライアントの接続状況を確認できるコマンドを追加した

version 1.1.6.4 (Jan/17/2016)
	・接続中のクライアントがいる場合はスリープを抑止するようにした

version 1.1.6.3 (Nov/01/2015)
	・サーバ側の待ち受けIPアドレスを複数指定可能(ただし最大8つまで)にした

version 1.1.6.2 (Sep/13/2015)
	・サーバ側のTSパージ処理は実質不要なので簡素化した
	・BonDriver_Splitterで、使用中BonDriverのPurgeTsStream()/SetChannel()/GetTsStream()の呼び出しを排他化した
	  #読み込んだBonDriver内部での排他処理が適切に行われていない場合に備えての保険

version 1.1.6.1 (Sep/09/2015)
	・排他ロックの先行優先に関して、2番手以降の排他権の獲得順序を厳密に要求順にした

version 1.1.6.0 (Sep/05/2015)
	・チャンネルロック機能で先行優先の排他ロックを可能にした
	  #ついでに設定方式を数値による優先度指定方式にした

version 1.1.5.4 (May/08/2015)
	・サービス登録できるバージョンを追加した
	・プロセスとスレッドの優先度を設定できるようにした
	・UI有りバージョンにini再読み込み機能を追加した
	・UI有りバージョンの情報窓を標準の閉じる操作で非表示にできるようにした

version 1.1.5.3 (May/06/2015)
	・サーバにタスクトレイから終了と接続クライアント情報の表示/非表示が出来るだけのUIを追加した

version 1.1.5.2 (Feb/23/2015)
	・クライアント側で、チャンネル変更後最初のTSバッファが受信されるまでGetSignalLevel()を
	  ブロックするようにした
	・サーバ側で、BonDriverに対して実際にSetChannel()が行われた場合、それ以降に送信される
	  TSバッファとCNR値は、確実にチャンネル変更後に取得した物になるようにした
	  #もっとも、結局はその先のBonDriver次第ではある
	・サーバ側のTsReader()で使用する各変数を構造体にまとめた

version 1.1.5.1 (Feb/02/2015)
	・COMを使用するBonDriverへの対策を追加
	  #BonDriverによっては内部でCOMの初期化/終了処理を行う物があるが、使い方によっては
	  #初期化は呼ばれても終了処理が呼ばれない場合がある為、COMの初期化/終了処理を
	  #サーバプロセス側で行っておくようにした

version 1.1.5.0 (Jan/30/2015)
	・サーバ側で一旦ロードしたBonDriverを、使用クライアントがいなくなった時にFreeLibrary()するのを
	  許可しない設定を追加
	・クライアント側はバージョン表記のみの変更

version 1.1.4.10 (Jan/29/2015)
	・通るべきCloseTuner()を通らないコードパスがあったのを修正

version 1.1.4.9 (Jan/28/2015)
	・BonDriverインスタンスを共有している複数のクライアントがほぼ同時にCloseTuner()した場合に、
	  解放済みメモリにアクセスしてしまう場合があったのを修正

version 1.1.4.8 (Jan/26/2015)
	・IBonDriver::Release()内部でのAccess Violation等の発生を無視する設定を追加

version 1.1.4.7 (Dec/19/2014)
	・IPv6に対応した
	・ホスト名として許可する長さを63文字以下から255文字以下にした
	・サーバ側のlistenソケットのオプションをSO_EXCLUSIVEADDRUSEに変更した(winsockの仕様への対応)
	・その他ロジックは変更無しでのソースコード整形

version 1.1.4.6 (Nov/21/2014)
	・あるBonDriverインスタンスをCloseTuner()する際はTS読み出しスレッドを必ず停止させておくようにした
	・あるBonDriverインスタンスがCloseTuner()時に、チューナのオープン状態フラグが正しく反映されない
	  パターンがあるのを修正
	・レアケースだけどデッドロックするパターンへの対策を追加
	・iniファイルが存在しなかった場合はエラーになるようにした

version 1.1.4.5 (Sep/30/2014)
	・クライアント側で、Winsockの初期化をDllMain()から最初のCreateBonDriver()に移動

version 1.1.4.4 (Sep/21/2014)
	・クライアント側で、SetChannel()に失敗した場合はシグナルレベル(実態はCNRだが)を0にするようにした

version 1.1.4.3 (Sep/13/2014)
	・クライアント側で、ネットワークが切断されている状態でアプリから各種BonDriverAPIを呼び出されると、
	  アプリに処理が返らなくなる場合があったのに対応

version 1.1.4.2 (Aug/28/2014)
	・クライアント側でのTSデータ用メモリ確保&コピー処理を削減
	・サーバ、クライアントそれぞれの受信スレッドを少し変更
	  #冗長なチェックの削除及び、やり取りされるコマンドパケットの内容(サーバからクライアントのパケットは殆どが
	  #TSデータ用=ペイロードの大きなパケットである、等)にあわせた最適化
	・delete対象として、NULLでない場合が大半の物に付いてはNULLチェック削除
	・delete後、即スコープを抜けるなどでNULLクリアが不要な物はNULLクリア削除
	・その他ロジックは変更無しでのソースコード整形

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)
	・初版リリース

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages