まずは以下のような機能を持つ単純な server program について考察しよう。
この server は短い文字列を送信するだけなので、 一度に処理する接続は一つだけとしよう。すなわち、 multi-thread を使わず、同一 thread 内で service 処理を記述するものとしよう。 まずは C で書いてみよう。Linux 版で gcc を前提にしたものを以下に示す。 エラー処理(といってもそれまでに開いた socket を close してプログラム を抜けるだけであるが)のために若干長くなっているが、基本的には 単純である。send() についてはエラーが あろうが無かろうが service を終了して接続を切ることに変わりはないので エラー処理はつけてない。また最後の2行は決して実行されない(その前に while(1) があるので)が一応つけてある。 #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <sys/types.h> #include <sys/socket.h> #define BACKLOG 3 #define SERVICE_PORT 8888 int main() { int s; int t; struct sockaddr_in sa; struct sockaddr_in ca; socklen_t calen; memset((char*)&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_port = htons( SERVICE_PORT ); sa.sin_addr.s_addr = htonl( INADDR_ANY ); if((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) return 1; if(bind(s,(const struct sockaddr*)&sa,sizeof(sa)) == -1) { close(s); return 1; } if(listen(s,BACKLOG) == -1) { close(s); return 1; } while(1) { calen = sizeof(ca); if((t = accept(s,(struct sockaddr*)&ca, &calen)) == -1) { close(s); return 1; } send(t, "Hello\r\n", 7, 0); close(t); } close(s); return 0; } このプログラムを実行すると port 8888 で接続を待つ。同一マシンの別プロセスから telnet localhost 8888 とすれば、 $ telnet localhost 8888 Trying 127.0.0.1... Connected to localhosts (127.0.0.1). Escape character is '^]'. Hello Connection closed by foreign host. $ のようになるだろう。 |