Windows ソケット : 予備知識
更新 : 2007 年 11 月
ここでは、Windows ソケットの性質と用途について説明します。以下の内容についても説明します。
ソケットの定義
SOCKET データ型
ソケットの用途
Windows ソケットの仕様では、Microsoft Windows 用にバイナリ対応ネットワーク プログラミング インターフェイスが定義されています。Windows ソケットはカリフォルニア大学バークレー校で開発された Berkeley Software Distribution (BSD 4.3) 版の UNIX ソケットをベースにしています。この仕様には、BSD スタイルのソケットと、Windows 固有の拡張機能が規定されています。Windows ソケットを使うと、Windows ソケット API に準拠したあらゆるネットワークを経由してアプリケーション間で通信できます。Win32 では、Windows ソケットによってスレッドの安全性が保証されます。
多くのネットワーク ソフトウェアの販売元は、伝送制御プロトコル/インターネット プロトコル (TCP/IP)、Xerox ネットワーク システム (XNS)、Digital Equipment 社の DECNet プロトコル、Novell 社のインターネット パケット交換/順次編成パック交換 (IPX/SPX) などのネットワーク プロトコルに準拠した Windows ソケットをサポートしています。現在の Windows ソケット仕様で定義されているソケットの抽象化は TCP/IP 用ですが、どのネットワーク プロトコルでも Windows ソケットを実装した独自のダイナミック リンク ライブラリ (DLL: Dynamic Link Library) を用意するだけで、Windows ソケット準拠になります。Windows ソケットを使って記述されている商用アプリケーションの例として、X Windows サーバー、端末エミュレータ、電子メール システムがあります。
メモ : |
---|
Windows ソケットの目的は、基盤になっているネットワークを意識させないことです。つまり、ネットワークについて詳しく知らなくても、ソケットをサポートするネットワークならば、どのネットワーク上でもアプリケーションを実行できます。したがって、この資料では、ネットワーク プロトコルの詳細については説明しません。 |
MFC (Microsoft Foundation Class) ライブラリは、Windows ソケット API を使ったプログラムをサポートするために、2 つのクラスを提供しています。1 つは高度な抽象化を行う CSocket であり、ネットワーク通信のプログラミングを単純化します。
Windows ソケットの仕様では、Windows ソケットは Microsoft Windows におけるネットワーク コンピューティング用のオープン インターフェイスであると定義されています。現在の Version 1.10 は、TCP/IP コミュニティに所属する個人と会社の大規模なグループによってオープン ネットワーキング規格として策定されたものであり、自由に利用できます。現時点のソケット プログラミング モデルは、インターネット プロトコル スイートを使って、単一の "通信ドメイン" をサポートします。この仕様は Windows SDK にあります。
ヒント : |
---|
ソケットはインターネット プロトコル スイートを使用するため、"情報ハイウェイ" でインターネット通信をサポートするアプリケーションにとって最適な手段といえます。 |
ソケットの定義
ソケットは通信のエンドポイントです。つまり、Windows ソケット アプリケーションは、このオブジェクトをとおしてネットワーク経由のデータ パケット交換を行います。ソケットには型があり、実行プロセスと対応付けられます。名前を付けることもできます。現時点では、ソケットの通信相手は同一の "通信ドメイン" 内にあり、インターネット プロトコル スイートを使う別のソケットに限られます。
ソケットには 2 種類ありますが、両方とも双方向ソケットです。つまり、両方向同時に通信できるデータ フローです (全二重)。
次の 2 種類のソケットがあります。
ストリーム ソケット
ストリーム ソケットは、レコード境界のないデータ フロー、つまりバイト ストリーム用です。ストリームの受け渡しおよびその正しいシーケンスは保証されており、重複することはありません。
データグラム ソケット
データグラム ソケットは、レコード単位のデータ フローをサポートします。しかし、このデータ フローの受け渡しは保証されません。したがって、シーケンスや非重複は保証されません。
"シーケンスが守られる" とは、パケットが送出時の順番で配達されることです。"非重複" とは、各パケットが 1 回しか配達されないことです。
メモ : |
---|
XNS などの一部のネットワーク プロトコルでは、レコードをバイト ストリームではなく、レコード単位のストリームにできます。ただし、最も一般的な TCP/IP プロトコルでは、ストリームはバイト ストリームです。Windows ソケットでは、基盤となるプロトコルに依存しない抽象化レベルが提供されます。 |
ソケットの種類および用途については、「Windows ソケット : ストリーム ソケット」および「Windows ソケット : データグラム ソケット」を参照してください。
SOCKET データ型
MFC の各ソケット オブジェクトには、Windows ソケット オブジェクトへのハンドルがカプセル化されています。ハンドルのデータ型は SOCKET です。SOCKET ハンドルは、Windows の HWND に似ています。MFC のソケット クラスでは、カプセル化されたハンドルを操作できます。
SOCKET データ型については、Windows SDK で詳しく説明されています。「Windows Sockets」の「Socket Data Type and Error Values」を参照してください。
ソケットの用途
ソケットは、少なくとも次の 3 つの通信コンテキストで使用できます。
クライアント サーバー モデル
ピアツーピア シナリオ (チャット アプリケーションなど)
リモート プロシージャ コール (RPC)。受信側アプリケーションにメッセージを関数呼び出しとして解釈させます。
ヒント : |
---|
MFC ソケットの理想的な使い方は、通信の両端を自分で作成し、両端に MFC を使う場合です。非 MFC アプリケーションとの通信時の管理方法など、このトピックの詳細については、「Windows ソケット : バイトの順序付け」を参照してください。 |
詳細については、Windows ソケットの仕様で ntohs、ntohl、htons、htonl を参照してください。また、次のトピックも参照してください。