二つのストリームで双方向で通信するツール「StreamRelay.NET.exe」と「StreamRelay.jar」

2つのストリームを結びデータを双方向でやりとりするプログラム「StreamRelay.NET.exe」と「StreamRelay.jar」を作ったので、その使い方の紹介。

---
### 簡単なアーキテクチャから。

![図](http://rocketeer.dip.jp/sanaki/free/StreamRelay001.png)

プログラムの引数で、二つのストリームのソース(実体)を指定することで、そのストリーム間でデータのやり取りが行われる。
例えば、片方のストリームのソースをコンソール(標準)にして、もう片方のストリームをねっワーク(TCP)にすれば、netcat の代替となる。

---
### ストリームの名称

便宜上、ネットワークサーバになれる側のストリームを「ローカル(Local)」と呼称し、なれない側のストリームを「リモート(Remote)」と呼称している
この呼称が、オプション指定に頻繁に出てくることになる。
例えば、local側をコンソール、remote側をネットワーク(TCP)とすれば、netcatのクライアント・モードと同等になる。

---
### ダウンロードとインストール

- Java版 [StreamRelay.jar](http://rocketeer.dip.jp/sanaki/free/jfree11.htm)
- .NET Framework版 [StreamRelay.NET.exe](http://rocketeer.dip.jp/sanaki/free/free119.htm)

基本的には、
1.上記よりダウンロード
2.信用できる場合はZoneID をはずす(.NET Framework 版で ZoneID付DLLが読み込まれないため)
3.解凍
4.実行するだけ (引数がない場合 usage が表示される)

---
### オプション指定

必須なのは、「LocalPort」と「RemotePort」
- 0より大きい場合(<65536)、ネットワーク(TCPとかUDPとか)
- 0 の場合、コンソール(標準入出力)
- -1 の場合、外部プログラム
- -2 の場合、名前付きパイプ(現状 StreamRelay.NET.exe のみ)
- -4 の場合、シリアルポート(現状 StreamRelay.NET.exe のみ)

---
### オプション指定(Request と Response)

オプションとして「Request」とか「Response」とかは、
- 「**Request**」 : 「ローカル」と呼称するストリームから「リモート」と呼称するストリームへの流れ
- 「**Response**」 : 「リモート」と呼称するストリームから「ローカル」と呼称するストリームへの流れ
をそれぞれ意味している

---
### 設定ファイルからオプションを読み込む

通常、オプションはコマンドライン引数からになるが、そのエスケープ処理が面倒というのもあって、設定ファイルから読み出すことも可能
一つのオプションを一行に書けばよい。

Java版
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -ConfigFile "FileName"`
または
`StreamRelay.bat -ConfigFile "FileName"`

設定ファイルの記述方法は「Sample\sample_conf.txt」を参照のこと

.NET Framework版
`StreamRelay.NET.exe -ConfigFile "FileName"`

設定ファイルの記述方法は「Sample\config.txt」を参照のこと

---
### レジストリからオプションを読み込む

.NET Framework 版は、レジストリからオプションを読み込む事も可能

`StreamRelay.NET.exe -Registry "SubKeyName"`

既定のレジストリキーは「HTLM\SOFTWARE\UrlRewriteProxy\<SubKey>」

レジストリキーへの設定方法は、「sample\config.reg」を参照のこと

---
### ストリームの奪い合い(コンソールについて)

「ローカル」も「リモート」も入力ソースの実体としてコンソール(キーボードから入力(標準入力))となった場合、「ローカル」側の入力源となり、「リモート側」は入力源なしとなる仕様としている
よって、
`java.exe -jar StreamRelay.jar -localport 0 -remoteport 0 < a.txt`
`StreamRelay.NET.exe -localport 0 -remoteport 0 < a.txt`
の場合、
**「ローカル」のストリーム(コンソール(標準入力))からa.txtが読まれて、「リモート」のストリーム(コンソール(標準出力))へ書き込まれる。**

という事になる

---
### StreamRelay.jar 

- [netcat の代替としての StreamRelay.jar](http://qiita.com/tomoki0sanaki/items/c8794253f715e651c879)
- [URLRewiteツールとしての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/a979aa4e0540143f47cd)
- [スクリプト実行サーバ(NodeJSの代替)として StreamRelay.jar](http://qiita.com/tomoki0sanaki/items/8a9d79bc8e10e8851f01)
- [cat/TYPE の代替としての StreamRelay.NET.jar](http://qiita.com/tomoki0sanaki/items/b8376afae92f2e4940d4)
- [Proxy 経由で転送する StreamRelay.jar](http://qiita.com/tomoki0sanaki/items/d1572590f1c7b70f990f)
- [ゲートウェイとしての StreamRelay.jar](http://qiita.com/tomoki0sanaki/items/e31440e6acc6a06b4c38)
- [圧縮コマンドの代替としての StreamRelay.jar](http://qiita.com/tomoki0sanaki/items/079dd9302af4333257c1)
- [アーカイバコマンドの代替としての StreamRelay.jar のサポートプログラム](http://qiita.com/tomoki0sanaki/items/6003df14ba97a71f0ac0)
- [ポートフォワーダとしての StreamRelay.jar](http://qiita.com/tomoki0sanaki/items/11b3aa4ea0c63dcc6748)
- [StreamRelay.jarのログ出力機能](https://qiita.com/tomoki0sanaki/items/567d7b9576b226cca056)
- [stone/stunnel の代替としての StreamRelay.jar (SSLクライアント編)](http://qiita.com/tomoki0sanaki/items/1c6060688f80ac9d52a6)
- [sslscan の代替としての StreamRelay.jar](http://qiita.com/tomoki0sanaki/items/54fc9380179aff2c0e7c)
- [ncatのブローカーモードの代替としての StreamRelay.jar](http://qiita.com/tomoki0sanaki/items/7966935869cdcb7aabcc)
- [nkf の代替としての StreamRelay.jar (文字コード変換)](http://qiita.com/tomoki0sanaki/items/fe7ebd99787866ad0f61)
- [script コマンドの代替としての StreamRelay.jar](http://qiita.com/tomoki0sanaki/items/38f3df30a8fb66b231e6)
- [サウンドレコーダーの代替としての StreamRelay.jar](http://qiita.com/tomoki0sanaki/items/a18d7cd08f8c1c78692d)
- [md5sum コマンドの代替としての StreamRelay.jar (ハッシュ/チェックサム/HMAC計算)](http://qiita.com/tomoki0sanaki/items/c3f2b781620bbb2f7910)
- [符号化コマンドとしての StreamRelay.jar](http://qiita.com/tomoki0sanaki/items/9245481458fe0c5497b7)
- [ファイル暗号化コマンドとしての StreamRelay.jar](http://qiita.com/tomoki0sanaki/items/a5971199d7f20806280b)
- [StreamRelay.jar で入力ダイアログで暗号鍵を与える](https://qiita.com/tomoki0sanaki/items/4071d5e73bd2810e18a6)
- [zebedee のような vpn の代替としての StreamRelay.jar](http://qiita.com/tomoki0sanaki/items/6b2f97df60b34da099f2)
- [環境表示プログラムとしてのStreamRelay.jar](http://qiita.com/tomoki0sanaki/items/27dbc386ced103973e81)
- [WebSocketCat(wscat) の代替としての StreamRelay.jar](https://qiita.com/tomoki0sanaki/items/ae6015bf0b259b624207)
- [StreamRelay.jarのGUIについて](https://qiita.com/tomoki0sanaki/items/6838020c71a84e76db80)
- [StreamRelay.jarに同梱している ZipStream.class と ArchiveStream.jar でアーカイバを操作する](https://qiita.com/tomoki0sanaki/items/5ee05bffe6d16751df81)
- [curl のような wget のようなウェブクライアントの代替としてのStreamRelay.jar](https://qiita.com/tomoki0sanaki/items/d3288cfad06de3bf52a3)


---
### StreamRelay.NET.exe

- [netcat の代替としての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/d2523a2c2b02419af194)
- [スクリプト実行サーバ(NodeJSの代替)として StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/216016ed763c7c9b4dc3)
- [cat/TYPE の代替としての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/d2523a2c2b02419af194)
- [cat/TYPE の代替としての StreamRelay.NET.exe (NTFS代替ストリーム)](http://qiita.com/tomoki0sanaki/items/d505a7479f7f8c4d0d49)
- [Proxy 経由で転送する StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/86038e490e93b7dfb5b2)
- [HTTP Proxy としての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/2d17cf0da39238dcbd79)
- [telnet コマンドの代替としての StreamRelay.NET.exe](https://qiita.com/tomoki0sanaki/items/4b4c7d23755b4b22ddce)
- [ゲートウェイとしての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/fa96d851613a952bd396)
- [Windows認証させる StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/d3c9cdfba7d54b878806)
- [圧縮コマンドの代替としての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/763bda379b32d968135d)
- [アーカイバコマンドの代替としての StreamRelay.NET.exe のサポートプログラム](https://qiita.com/tomoki0sanaki/items/1030f1622dabd0fb810c)
- [符号化コマンドとしての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/84e320c078742f8ffd8a)
- [BinHex符号化コマンドとしての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/de3254cc32251b3d5f4b)
- [ポートフォワーダとしての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/4bdfd7f47923b05aab80)
- [StreamRelay.NET.exeのログ出力機能](https://qiita.com/tomoki0sanaki/items/2c10152ad46c035c966d)
- [stone/stunnel の代替としての StreamRelay.NET.exe (SSLクライアント編)](http://qiita.com/tomoki0sanaki/items/8af1a134865491558050)
- [stone/stunnel の代替としての StreamRelay.NET.exe (SSLサーバ編)](http://qiita.com/tomoki0sanaki/items/cefef65ccb205338f60f)
- [STARTTLS ゲートウェイとしての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/e0331b329013de049b14)
- [SMTP認証を代替するStreamRelay.NET.exe](https://qiita.com/tomoki0sanaki/items/57a0cdd2c448770f73d4)
- [ncatのブローカーモードの代替としての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/e51f313dc8a454a19328)
- [nkf の代替としての StreamRelay.NET.exe (文字コード変換)](http://qiita.com/tomoki0sanaki/items/9b019eef05046f372cf2)
- [script コマンドの代替としての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/1689b6539895dd90f49c)
- [ターミナルの代替としての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/d8006bbd653d255a28c1)
- [サウンドレコーダーの代替としての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/7b5260b09803ceee074b)
- [サウンドレコーダー/サウンドプレーヤーの代替としての StreamRelay.NET.exe(NAudio)](https://qiita.com/tomoki0sanaki/items/14233d101f970ee8bbd1)
- [音声合成としての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/0a4916345af50454b816)
- [音声認識としての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/5d791b92ea1f2553380f)
- [md5sum コマンドの代替としての StreamRelay.NET.exe (ハッシュ/チェックサム/HMAC計算)](http://qiita.com/tomoki0sanaki/items/b8d60fca9a2ccdf93f69)
- [ファイル暗号化コマンドとしての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/f58ac77662b194cb562a)
- [StreamRelay.NET.exe で入力ダイアログで暗号鍵を与える](https://qiita.com/tomoki0sanaki/items/13127d8f3877aa63bcf5)
- [zebedee のような vpn の代替としての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/f399b1266ddaabfa65e9)
- [WindowsNTサービスとしてのStreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/c85d007ab87066900312)
- [DPAIの試用ツールとしてのStreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/a194d6fd12429dd6862e)
- [乱数アルゴリズムの試用ツールとしてのStreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/36df6463cafec0f93313)
- [完全消去の代替としての StreamRelay.NET.exe](https://qiita.com/tomoki0sanaki/items/c86ecdb6f56a30d980b0)
- [bash仮想ネットワークファイルのお相手としての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/cf06b49fe293b5f65517)
- [httptunnel の代替としての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/b63cb3346130770556f3)
- [WebSocketCat(wscat) の代替としての StreamRelay.NET.exe](https://qiita.com/tomoki0sanaki/items/dbe1e98a44b9e0e404ea)
- [curl のような wget のようなウェブクライアントの代替としてのStreamRelay.NET.exe](https://qiita.com/tomoki0sanaki/items/9dbde2699ff1d8aa5395)
- [ソースルーティング試験ツールとしてのStreamRelay.NET.exe](https://qiita.com/tomoki0sanaki/items/8da7f82c09197428d64b)
- [トンネルプロトコル(ICMPTunnel)ツールとしてのStreamRelay.NET.exe](https://qiita.com/tomoki0sanaki/items/027491b9d87f3223cde9)
- [grep/sed コマンドの代替としての StreamRelay.NET.exe](https://qiita.com/tomoki0sanaki/items/63e4a1c36293a37ca9c7)
- [SSRF on HostHeader Poisoning を確認するツールを作った](https://qiita.com/tomoki0sanaki/items/b85052b28393008fbe56)


---
### StreamRelay.NET.exeのプラグイン作成方法

- [文字コードプラグインの実装方法](https://qiita.com/tomoki0sanaki/items/ad27e830a5d3bc47a5f3)
- [インターフェイス IPluginBase について](https://qiita.com/tomoki0sanaki/items/60613c29f0d627353e67)
- [ランダムプラグインの実装方法](https://qiita.com/tomoki0sanaki/items/26451844720d3121ae69)
- [パスワード攪拌関数プラグインの実装方法](https://qiita.com/tomoki0sanaki/items/925cc3def304e861d152)
- [Hash/Mac プラグインの実装方法](https://qiita.com/tomoki0sanaki/items/086133de5a0551986e04)
- [ロギングプラグインの実装方法](https://qiita.com/tomoki0sanaki/items/b4cd5ed19fccd9a34200)
- [一覧プラグインの実装方法](https://qiita.com/tomoki0sanaki/items/1bb130fa08f94b64317a)
- [フィルタストリームをプラグインとして実装する方法](https://qiita.com/tomoki0sanaki/items/c012f3b399439bbbdb41)
- [スクリプトプラグインの実装方法](https://qiita.com/tomoki0sanaki/items/7ea3653583ff1b7282a2)
- [入出力ストリームをStreamRelay.NET.exe のプラグインとして実装する方法について説明する](https://qiita.com/tomoki0sanaki/items/c3854ee7abd76200dc46)
- [暗号プラグインの実装方法](https://qiita.com/tomoki0sanaki/items/3f6692eea14a25d04bee)

---
### リンク

- [アーカイバ内部のLog4jのバージョンを調べる](https://qiita.com/tomoki0sanaki/items/e3b435fa19c84d3735a0)

---