rcmdnk's blog

Socket.IO: Questions and Answers (English Edition)

socat (Multipurpose relay (SOcket CAT)) は簡単にソケット通信をサーバー側としてもクライアント側としても 使える便利なコマンドです。

Sponsored Links

インストール

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>

とすることで、address1address2をつなげます(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-listenudp-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の一回目はその上の時間と文字列の長さなどとともに受け取った文字列の情報としての出力。)

こんな感じで簡単にソケット通信のテストをしたり、 ポート開放のテストをしたりすることが出来るので結構便利です。

Sponsored Links
Sponsored Links

« Bootstrap 3でモニタ用的なテンプレートを作ってみた 2 Mac 10.10 Yosemiteでのホスト名の設定 »