【コラム】
第20回は、ネットワーククライアントのHello Worldです。これは、特定のホストの特定のポート番号にTCPで接続し、そこから受信した文字列を表示するプログラムです。具体的には、第12回で作成したネットワークサーバのプログラムに接続し、サーバから送られてくるHello Worldの文字列を表示するようなクライアント側のプログラムを作成します。
第12回では、サーバ側の動作をテストするため、クライアント側にはtelnetコマンドまたはnc(netcat)コマンドを使いましたが、今回はそのクライアント側のプログラムを、各種言語で作成してみるという趣向です。
まずはC言語からです(リスト1)。ここでは、エラー処理はあえて省略しています。クライアント側のプログラムでは、socket()でソケットを作成したあと、connect()でサーバに接続します。サーバのIPアドレスとポート番号は、connect()の引数であるsockaddr_in構造体にあらかじめ値を代入しておくことによって指定します。ここでは、ループバックアドレス(127.0.0.1)の、ポート番号12345に接続することになります。
接続が確立すれば、あとは通常のファイル記述子からデータを読むのと同じように、read()でデータを読んで、write()で標準出力に出力すればOKです。なお、ここでは1回のread()で読んだデータを出力したら、プログラムを終了するようにしています。
ネットワーク接続テストを行うには、xtermなどの端末エミュレータを2つ開き、その一方でサーバ側プログラムを起動してから、他方でクライアント側プログラムを起動するようにします。
サーバ側のプログラムは、第12回で作成した各種言語用プログラムの中のひとつを使えばOKです。当然のことながら、サーバ側とクライアント側が同じ言語で書かれている必要はありません。
実行例1のように、まずサーバ側(ここではPerl版)を実行し、そのあと実行例2のようにクライアント側(ここではC言語版)を実行します。すると、クライアント側から、サーバ側であるlocalhostのTCPの12345番ポートに接続が行われ、サーバからHello Worldのメッセージが送られてきて、クライアント側に表示されます。
ネットワーククライアントのプログラムを、Perlで記述するとリスト2のようになります。プログラムはC言語とよく似ており、socket()、connect()といった関数や、PF_INET、INADDR_LOOPBACKなどのラベルもC言語と同じであることがわかります。
Javaアプリケーションで記述すると、リスト3のようになります。Javaアプリケーションでは、Socketクラスのインスタンスを作成すれば、ソケット作成とサーバへの接続が完了します。サーバからデータを受信するには、まずgetInputStream()で入力ストリームを取得して、その入力ストリームをread()します。
Pythonでは、リスト4のようにPerlに類似したコーディングになります。ただし、データの受信にはrecv()を使います。
Rubyでは、TCPSocket.open()を使うことにより、ソケット作成からサーバへの接続までが一気に行えます(リスト5)。接続完了後は、read()でデータを受信し、write()でデータを出力しています。
Tclでは、リスト6のようにsocketコマンドを使ってサーバに接続します。socketはチャンネルIDを返すため、それを[ ]で取り込んでclに代入します。あとはclからreadし、そのデータをputsで出力すればOKです。putsには、余分な改行が付かないように-nonewlineオプションを付けておきます。
最後に、少し変わった例として、Bashを使う方法です。Bashでは、「/dev/tcp/ホスト名/ポート番号」という特別なファイル名をリダイレクトに使用することにより、そのホストのそのポート番号に対してTCP接続を行うことができます。この/dev/tcpというのは、Bashのみで有効な仮想のファイルであり、実際に/dev/tcpというデバイスファイルが存在するわけではありません。
これを利用してネットワーククライアントを作成したのが、リスト7です。ここでは、/dev/tcp/localhost/12345をcatの標準入力にリダイレクトし、その結果をいったん変数bufに取り込んでからechoで出力しています。
| トマトを食べれば痩せられる!? -京大ら、新発見の成分で肥満改善効果を実証 [21:00 2/10] |
| JAXA、液体シリコン中に残存する共有結合を観察 -大口径ウェハの実現に期待 [20:11 2/10] |
| NEDOなど、熱膨張が小さな樹脂複合材料ペレットの量産化に成功 [19:22 2/10] |
| 理研、一般顕微鏡を蛍光顕微鏡に強化できるアダプタを試作して性能を実証 [19:15 2/10] |
| 天の川のブラックホールが小惑星を飲み込んでいる - NASAが発表 [18:08 2/10] |
|
「オレのチキンを食べたのは誰だ!」ナイフを持った男が暴れる [14:06 2/11] キャリア |
|
【エンタがビタミン♪】“16歳で結婚を決めていた”豊田エリー。柳楽優弥との運命の出会いとプロポーズに感激の嵐。 [14:06 2/11] キャリア |
|
【イタすぎるセレブ達】Jay-Z&ビヨンセ夫妻ガッカリ? “Blue Ivy”の名で商標登録を取ったブティックがあった! [14:05 2/11] キャリア |
|
【イタすぎるセレブ達】女優クリスティン・ベル、「私には全身に214のタトゥーがあるの」と仰天の告白ビデオ!? [14:05 2/11] キャリア |
|
実録!SNSやオフ会から始まった恋物語! [14:05 2/11] キャリア |