socat (Multipurpose relay (SOcket CAT)) は簡単にソケット通信をサーバー側としてもクライアント側としても 使える便利なコマンドです。
インストール
Linux
apt-get
な環境では apt-get install socat
で。
Redhat5系でインストールしようとしたらデフォルトのレポジトリには無いみたいで PMForgeのレポジトリを入れる必要があったので、
$ sudo wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
$ sudo rpm -Uvh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
$ sudo yum install socat
としました1。
Mac
Homebrewで
$ brew install socat
その他
公式 からダウンロードして
$ wget http://www.dest-unreach.org/socat/download/socat-1.7.2.4.tar.gz
$ tar xzf socat-1.7.2.4.tar.gz
$ cd socat-1.7.2.4
$ .configure
$ make && make install
使い方
基本的には
$ socat <address1> <address2>
とすることで、address1
とaddress2
をつなげます(relayします)。
local同士で対話してみます。TCPを使う方法として
$ socat tcp-listen:70000 stdout
とすると、70000番ポートでTCPの受け入れ状態と、
stdout
を繋げることになるので、
結果的に、70000番ポートに入ってきたものをそのまま出力するサーバーみたいになります。
この状態で 違うターミナルから
$ socat tcp-connect:localhost:70000 stdin
とすると、stdin
で標準入力したものを、
localhostの70000番ポートにTCPに送る状態になります。
この状態で、tcp-connect
してる端末で、
$ socat tcp-connect:localhost:70000 stdin
test
と打ってみると、tcp-listen
している方の端末にも
$ socat tcp-listen:70000 stdout
test
と表示されるはずです。
勿論、socat tcp-connect
の代わりに
$ telnet localhost 70000
test
とかしても通信できます。
また、この状態だとconnect
下側が接続を切ると、listen
下側も終了するし
1つしかコネクションが許されない状態ですが、
$ socat tcp-listen:70000,fork stdout
とfork
をポート番号の後に付けると複数のコネクションを許す状態になり
(コネクション毎にforkして新しいプロセスを作る)、
connect
側で切っても大元のlisten
プロセスは生き続けます。
勿論、ネット越しにも使えて、connectする方のlocalhost
の代わりに
接続したいホストを指定してあげればOK。
UDPでもudp-listen
とudp-sendto
で同じことが行えます。
また、-v
を使えるとちょっと詳しく情報が表示されます。
$ socat -v udp-listen:80000 stdout
としてサーバーを立てて、
$ socat udp-sendto:localhost:80000 stdin
test
とすると
$ socat -v udp-listen:80000 stdout
> 2014/XX/XX XX:XX:XX.XXXXXX length=5 from=0 to=4
test
test
と言った感じで表示されます。
(test
の一回目はその上の時間と文字列の長さなどとともに受け取った文字列の情報としての出力。)
こんな感じで簡単にソケット通信のテストをしたり、 ポート開放のテストをしたりすることが出来るので結構便利です。