質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.35%

BashでTCP/UDP通信を行う の解説をお願いします

解決済

回答 1

投稿

  • 評価
  • クリップ 4
  • VIEW 4,267

otaks

score 218

BashでTCP/UDP通信を行う
http://orebibou.com/2016/05/bash%E3%81%A7tcpudp%E9%80%9A%E4%BF%A1%E3%82%92%E8%A1%8C%E3%81%86/

このページでしていることを解説してください。
telnetと同じことをしているのでしょうか?

exec
&3
nc
などがよく分かりません。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

たぶん、一番重要なのは、3が何を意味するかです。それがわかると、見えてくると思います。

3ファイルディスクリプタの番号です。UNIX/Linuxではあらゆるプログラムにおいてファイル(標準入出力やネットワーク通信含む)の読み書きをするときはファイルディスクリプタというただの番号でやり取りしています。2>&1とかの21も同じくファイルディスクリプタの番号です。

ファイルには読み(r)と書き(w)があるため、各ファイルディスクリプタの番号に対してrかwかrwが設定されて、何かしらのデバイス(ファイル)に割り当てることができます。bashでは通常起動した直後は次のようになっています。

 番号   デバイス   モード 
0  stdin   r 
1  stdout   w 
2  stderr   w 
3  (無し)   - 

最初は012だけで、3以降は割り当てがありません。なお、3だけでなくそれよりも大きい数字が使えます(どこまで使えるかはulimitの制限等による)。そこで、exec 3<> /dev/tcp/相手先ホスト名/ポート番号としたときにどうなるかです。

execは「指定された新しいコマンドを実行して今のプロセスと置き換える」というコマンドです。Cのsystemと同じです。ただ、今回、execにはコマンドにあたる部分はありません。この場合は、3<> /dev/tcp/相手先ホスト名/ポート番号のファイルのリダイレクト処理だけして、置き換わるという動作をします。そう、この3<>...の部分はファイルのリダイレクトです。> hoge.txt< hoge.txtと書くのと同じで、3にtcpの接続先を割り当てるという意味になります。よって、このあとは、先ほどの表が下記のように変わります。

 番号   デバイス   モード 
0  stdin   r 
1  stdout   w 
2  stderr   w 
3  /dev/tcp/相手先ホスト名/ポート番号   rw 

こうしてTCP通信を普通のファイルや標準入出力のように扱えるようになったと言うことです。

忘れてました、どうやってアクセスするかですが、それが&3です。2>&1とかで使うのと一緒です。>&3なら3に出力、<&3なら3から入力となります。

最後に、ncですが、これはネットワーク通信をするためのコマンドのようです。上の動作は、クライアントの動作しかできませんが、ncはポートをリッスンできるため、サーバの動作を行うこともできます。man ncとしてmanページを参照すると良いと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/01 09:50

    一点だけ補足させていただくと、stdin は 0 だと思います (`ll /dev/std*`)

    キャンセル

  • 2016/06/01 18:31 編集

    > nygyukiさん
    ご指摘ありがとうございます。
    標準入力について勘違いしていたみたいです。回答を修正しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る