TCP Server Program
Date: 05-Feb-1998
(c) Copyright 1997, 1998 by H.Fujii
サーバプログラムは、一般に、複数のクライアントからの要求を
処理することが求められます。UNIXなどでは、fork()を使って
この処理を行うのが普通ですが、WIN32には fork() または、
直接それに相当するものはありません。そこで、代わりの方法が
必要になりますが、ここでは thread を使う場合を考えます。
プログラムの骨子
プログラムの骨格部分は、文献1に示して
ある例題を基礎にします。まずやるべき骨子を整理しましょう。
やるべきことは、次の通りです。
- 接続受信用のソケットを生成し、listen()状態に置く。
- 受信要求に対し accept() して、新しいソケットを得る。
- 受信処理を行う thread を起動生成し、その thread に accept() により
得られたソケットを渡す。
- 受信処理 thread では、渡されたソケットを使ってクライアントと通信
しながら処理をして、終了したら、ソケットを閉じて、消滅する。
- メインの thread では、受信処理 thread を起動したら、次の要求を
accept() する。
上の骨子で、問題になるのは thread の起動生成と、終了です。POSIX で
あれば、pthread_create() に相当するものが WIN32 では何か?また
POSIX であれば、thread 関数から return すると、その thread は消滅
しますが、WIN32 でも同じことが言えるか?この 2 点をまず押さえる必要が
あります。
WIN32 での Thread
WIN32 のマニュアル(WIN32 SDK Online Help)を見ると、Thread の生成に
と終了のためのいくつかの関数があります。
- _beginthread() と _endthread()
- _beginthreadex() と _endthreadex()
- CreateThread() と ExitThread()
このうち、最初の二つは、thread 関数が C のランタイムライブラリーを
使用する場合となっています。また、_beginthread() と _beginthreadex()
との大きな違いは、後者はセキュリティの指定、開始状態の指定(生成後、
直ちに実行するか、中断状態に置いておくかの指定)ができることのよう
です。
この記事未完
参考文献
- [1] Comer, Douglas E., "Internetworking with TCP/IP",
Vol.I, 2nd. Ed., Section 21.27 pp.359-362, Prentice-Hall (1991),
ISBN 0-13-468505-9.