【コラム】
第12回は少し趣向を変えて、ネットワークサーバのHello Worldです。具体的には、socketを使って所定のTCPのポートへの接続を待ち受け、そのポートへの接続が行われると、接続相手のクライアントに対してHello Worldのメッセージを返すようなプログラムを作成します。
ネットワークサーバのHello WorldをC言語で記述すると、リスト1のようになります。ここでは、プログラム本体の記述がわかりやすいように、エラー処理はあえて省略しています。
#include <sys/types.h> ← socket()を使うために必要
#include <sys/socket.h> ← socket()を使うために必要
#include <netinet/in.h> ← INETドメインソケットを使うため
#include <unistd.h> ← write()のため
#include <string.h> ← memset()のため
int
main()
{
int sv, sv_ac; ← socket()用とaccept()用のファイル記述子
struct sockaddr_in addr; ← INETドメインのソケットアドレス
int optval = 1; ← setsockopt()で使用
sv = socket(PF_INET, SOCK_STREAM, 0); ← INETドメインのTCPソケットを作成
setsockopt(sv, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval);
↑ ソケットアドレスの再利用を許可
memset(&addr, 0, sizeof addr); ← ソケットアドレスをゼロ初期化
addr.sin_family = AF_INET; ← INETドメインを指定
addr.sin_addr.s_addr = htonl(INADDR_ANY); ← IPアドレスは任意
addr.sin_port = htons(12345); ← ポート番号は12345
bind(sv, (struct sockaddr *)&addr, sizeof addr); ← ソケットアドレスを指定
listen(sv, SOMAXCONN); ← ソケットをLISTEN状態にする
sv_ac = accept(sv, 0, 0); ← 接続を受け付ける
write(sv_ac, "Hello World\n", 12); ← 接続相手にメッセージを出力
return 0;
}
ネットワークサーバの動作を確認するためには、クライアント側のコマンドも必要です。これには、telnetコマンドまたはnc(netcat)コマンドを使います。なお、telnetコマンドなどは使いますが、TELNETプロトコルでログインするわけではありません。
まずは、実行例1のように、サーバー側を実行します。ここで、別の端末ウィンドウに切り替え、そこからクライアント側のコマンドとして実行例2のように実行します。すると、自分自身のホストであるlocalhostの、TCPの12345番ポートに接続が行われます。その直後、サーバからHello Worldのメッセージが返って来て、接続が終了します。
$ ./socket_c_lang ← カレントディレクトリの実行ファイルを実行する
← この状態で、別の端末ウィンドウ等から実行例2を実行
$ ← 実行例2を実行後、シェルのプロンプトに戻る
$ telnet localhost 12345 ← localhostのTCPの12345番ポートに接続
Trying 127.0.0.1...
Connected to localhost. ← 接続確立
Escape character is '^]'.
Hello World ← サーバプログラムからのメッセージ
Connection closed by foreign host. ← 接続終了
$ ← シェルのプロンプトに戻る
Perlを使って記述すると、リスト2のようになります。同じく、エラー処理は省略しています。このように、socket、bindなどの関数名や、PF_INETなどの定数ラベルはC言語のものと同じであり、プログラム全体がC言語と似ていることがわかります。
#!/usr/bin/perl
use Socket; ← Socketモジュールを使用
socket(sv, PF_INET, SOCK_STREAM, 0); ← INETドメインのTCPソケットを作成
setsockopt(sv, SOL_SOCKET, SO_REUSEADDR, 1); ← ソケットアドレスの再利用を許可
bind(sv, sockaddr_in(12345, INADDR_ANY)); ← ポート番号12345、IPアドレス任意
listen(sv, SOMAXCONN); ← ソケットをLISTEN状態にする
accept(sv_ac, sv); ← 接続を受け付ける
print sv_ac "Hello World\n"; ← 接続相手にメッセージを出力
Javaアプリケーションで記述したサーバプログラムはリスト3のとおりです。このように、ServerSocketクラスを使ってソケットを作成し、accept()したあと、PrintWriterクラスのprint()メソッドを使って文字列を出力します。
import java.io.*; ← PrintWriterを使うため
import java.net.*; ← Socketを使うため
public class SocketJava {
public static void main(String[] args) {
try {
ServerSocket sv = new ServerSocket(12345); ← サーバソケットを作成
Socket sv_ac = sv.accept(); ← 接続を受け付ける
PrintWriter out = new PrintWriter(sv_ac.getOutputStream());
out.print("Hello World\n"); ←↑ 接続相手にメッセージを出力
out.flush(); ← 出力をフラッシュする
} catch (Exception e) {} ← エラー処理は省略
}
}
Pythonを使う場合はリスト4のようになります。コーディングは、Perlに類似したものとなっています。
#!/usr/bin/python
from socket import * ← socketモジュールをインポート
sv = socket(AF_INET, SOCK_STREAM) ← INETドメインのTCPソケットを作成
sv.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) ← ソケットアドレスの再利用を許可
sv.bind(('', 12345)) ← ポート番号12345、IPアドレス任意
sv.listen(SOMAXCONN) ← ソケットをLISTEN状態にする
(sv_ac, cl_addr) = sv.accept() ← 接続を受け付ける
sv_ac.send('Hello World\n') ← 接続相手にメッセージを出力
Rubyでは、TCPserverが使えるため、コードの行数が少なくなります(リスト5)。acceptの前のlistenは不要です。
#!/usr/bin/ruby
require 'socket' ← socketライブラリをロード
sv = TCPserver.open('', 12345) ← ポート番号12345のTCPのサーバソケットを作成
sv_ac = sv.accept ← 接続を受け付ける
sv_ac.write("Hello World\n") ← 接続相手にメッセージを出力
Tcl/Tkのスクリプト部分であるTcl(tclsh)を使うと、リスト6のようになります。まず、接続時に呼び出されるプロシジャを定義し、Tclの組み込みコマンドのsocketの引数で、そのプロシジャとポート番号を指定します。
#!/usr/bin/tclsh
proc accept {sv_ac cl_addr cl_port} { ← 接続時に呼び出されるプロシジャを定義
puts $sv_ac {Hello World} ← 接続相手にメッセージを出力
close $sv_ac ← 接続をクローズ
exit 0 ← 1回の接続でサーバを終了する
}
socket -server accept 12345 ← プロシジャ/ポート番号指定でサーバソケットを作成
vwait forever ← イベント(接続)を待つ
| 理研、脳・脊髄形成に必要な神経板湾曲の仕組みを解明 [20:16 5/25] |
| 京大、「慢性閉塞性肺疾患」患者の労作時呼吸困難は鍼治療が有効と実証 [20:08 5/25] |
| 120Hz SHVカメラ用イメージセンサーを使った撮像装置 - SHVフルスペック化へ [18:10 5/25] |
| 京大、視覚による物体認知は前頭前野からのトップダウン信号が重要と確認 [17:45 5/25] |
| 製品数の拡大だけでなくBCPの展開なども含めた総合力で事業の強化を図るTI [17:25 5/25] |
|
【連載】これだけは要チェック! TOEIC(R)単語帳 第108回 今回のお題は…「issue」 [20:00 5/27] キャリア |
|
TVアニメ『ペルソナ4』、新規カットを加えた再編集版を劇場でイベント上映 [20:00 5/27] ホビー |
|
[9nine]制服姿見納め? セーラー服で登場も川島海荷「4人はコスプレ」 [19:15 5/27] エンタメ |
|
「NO.6」4巻は書き下ろしドラマCD付、木乃のサイン会も [18:49 5/27] ホビー |
|
[今週の新刊]マンガ大賞3回ノミネート「アイアムアヒーロー」 カープ愛「球場ラヴァーズ」も [18:33 5/27] ホビー |
4つの診断で、自分の適性を見つめなおそう!
働くこと・挑戦し続けることへの思いを綴ったインタビュー
あなたにピッタリのアドバイスを読むことができます。
転職に必要な情報が収集できます
企業からアプローチのメッセージが届きます。