Winsock Programmer's FAQ
Winsock の基本プログラム例

ここでのサンプルは、Winsock で許されているさまざまな I/O 戦略 のいくつかを、どのように実装するのかを示しています(いくつの I/O 戦略を取ることが可能であるかについては、論説記事どの I/O 戦略を使う べきか?を読むとわかるでしょう)。

Echo プロトコル

各サンプルプログラムは、 echo クライアントか echo サーバのど ちらかです。サーバは受信したものを全て読み出し、それをそのまま送 り返します。クライアントはデータをサーバに送信し、その応答が送信 したものと同じかどうかをチェックします。クライアントプログラムは、 コネクションを閉じる前にちょっと待つことができるようになっていて、 これによって複数のクライアントを実行し、マルチコネクションサーバ をテストすることができます。

echo サーバという発想は、プログラムの機能よりもプログラムの構 造の方により注目することができるようにし、なおかつきちんと機能す るプログラムができます。もっと実用的なもの、例えば「チャット」プ ログラムなどを選んでも良かったのですが、そうすると結局は、 Winsock のプログラミングの問題よりもユーザインタフェースの詳細の 方に時間を費やすことになってしまうでしょう。

クライアントは実はどんな echo サーバとも動作します。Windows NT、Windows 2000 とほとんどの Unix では、7番ポートを占めるオプショ ンサービスがあり、私のサーバと全く同じように動作しているのです。 つまり、あなたの手が届かないインターネットの向こうのマシンとも echo のテストをすることができるのです。ただし、実際はそのような ホストを見つけるのは難しいかもしれません。というのも、7番ポート の echo は、ネットワーク攻撃に使用されることもあるので、ほとんど の管理者はこの機能をオフにしているからです。

構造と哲学

ここでのプログラムは、あまり大したことはしない、ある意味「最 小限」のものですが、それでも正しいエラーチェック、コネクションの 礼儀正しいシャットダウン、たくさんのコメント、などを全て完璧に行っ ています。またこれらのプログラムの一部をちょこっと拝借することが しやすいように考えられています。

各プログラムは、できる限り同じ形式に従うようにしています。も し別のサンプルの中に同じ名前の関数を見つけたら、それは同じ目的を 持った関数だと思ってもらって間違いないですので、それらを比較しつ つ勉強することができます。例えば、基本スレッドサーバの AcceptConnection() を見ると、スレッドを使用するとき、 クライアントからの接続を受け付ける方法をどのように変更すればよい かを勉強することができるわけです。

近日公開予定TM

最終的にはここにはさらにサンプルが増える予定です。私が今考え ているものは以下のようなものがあります。

  • 非同期ソケットのサーバ: 直API版と CAsyncSocket 版の 両方
  • select()の代わりに WSAEventSelect()を使うシングルスレッドのサー バ
  • UDP のクライアントとサーバ
  • オーバーラップ I/O のクライアントとサーバ
  • Endpoint-based client
  • ACE ベースの クライアントとサーバ
  • マルチスレッドクライアント(ネットワークスタックやサー バプログラムの負荷テストに便利なもの)

対応しているコンパイラ

私は今のところ、全てのコンソールモードプログラムを、Microsoft Visual C++ 5.0 SP3 のコマンドラインコンパイラ、フリー版の Borland C++ 5.5、GNUツールの Win32 移植版である Cygwin 1.0(EGCS 1.12)においてテストしています。以下に示す Makefile は、上記三つ の環境上の make ツール全てで動作します。

GUIプログラムは MFC を中心に作っていて、Visual C++ 5.0 上でテ ストしています。これは適当に決めたわけではありません。MFC 自身の 簡単さもありますが、他にも私の MFC ベースのフレームワークを使っ ていて、プログラムがより強力かつ追いかけやすいようになっているの です。もし Win32 API のコードを直で書いていたとすると、結局は貧 弱なサンプルになってしまうか、追いかけるのが大変なプログラムになっ ていたでしょう。

共通ファイル

まず始める前に、ここでのファイルを全てダウンロードしたほうが 良いでしょう。全てのコンソールモードのサンプルはこれらのファイル を必要としているからです。GUIプログラムも、この中にいくつかのファ イルを必要としています。

    Makefile - コンソールモードのサ ンプルをコンパイルするための Makefile(必須ではないが、サンプルプ ログラムをコンパイルするのが楽になる)。

    main.cpp - コンソールモードのサ ンプルプログラムの main()関数。コマンドラインオプショ ンを解析し、Winsock を初期化し、サンプルプログラムのドライバ関数 を呼び出し、そして Winsock をシャットダウンします。

    ws-util.cpp - 全てのサンプル プログラムで使用されている、Winsock ユーティリティ関数群。

    ws-util.h - ws-util.cpp 用のヘッ ダファイル。

サンプルプログラム

以下の各サンプルプログラムは、それぞれの設計方式を説明してい ます。それぞれの方式についてのより詳細な利点・欠点は、論説記事どの I/O 戦略を使う べきか?を読んでみてください。明らかに、どれか一つの方式 がどんな場合でも優れているというわけではありませんし、また選択肢 がそんなにたくさんあるわけでもありません。上記の記事のアドバイス とここでの具体例を見ていただければ、十分容易に判断できると思いま す。

各サーバで複数接続の制御のテストを行うには、一方のコマンドウィ ンドウでサーバを実行し、別のコマンドウィンドウから二つあるいはそ れ以上の基本ク ライアントを実行することによってできます。基本クライアントで はシャットダウンの実行を遅らせて、サーバからの応答を受信した後、 しばらくの間コネクションを open した状態のままにしています。この 遅延時間の間に、コマンドウィンドウを切り替えて、最初のクライアン トのコネクションが閉じられる前に、別のクライアントをいくつか実行 させることができるわけです。

    基本ブロッ ク型クライアント - ブロック型ソケットを使うクライアント。 これはここでのサンプルプログラムの中でもっともシンプルなものです。

    非 同期クライアント - 非同期型ソケットを使うクライアント。 これは MFC の GUI プログラムですが、CAsyncSocket やその派生クラ スは使っていません

    CAsyncSocket ベースのクライアント - MFC の非同期ソケットラッパークラ スである CAsyncSocket を使ったクライアント。

    基本ブロッ ク型サーバ - ブロック型ソケットを使うシンプルなサーバ。

    基本 マルチスレッドサーバ - メインスレッドはコネクションを受 け付けるループをずっと実行し続け、新規コネクションをそれぞれ専用 のスレッドに投げて処理を行うサーバ。

    select() ベースのサーバ - select() 関数を使って、た くさんのコネクションの制御を全て一つのスレッド内で管理するサーバ。


<< サンプルプログラム Basic Blocking Client >>
Last modified $Id: index.html,v 1.4 2002/11/09 20:54:13 ksk Exp $ Go to the original FAQ page
< Go to the main FAQ page << Go to the Home Page