Winsock Programmer's FAQ
第1章: Winsock の一般的な情報

1.1 - Winsock とは何ですか?

ウィンドウズソケット(略して "Winsock" あるいは "WinSock")は、 BSD Unix で普及している「ソケッ ト」の概念を元にした、Microsoft の Windows のためのネットワーク プログラミングインタフェース仕様を規定したものです。この中にはお なじみの Berkeley ソケットスタイルのルーチンと、以下に示すような Windows 特有の拡張の両方が含まれます。

  1. Winsock 1 のアプリケーションは、Winsock からの通知をウィンド ウズメッセージを通して受けることができます。これによって、ネット ワーク、ユーザインタフェース、バックグラウンド処理を全て、並列処 理の問題を気にすることなく処理できるプログラムが作れるようになり ます。
  2. Winsock 2 ではさらに多くの機能が追加されています。詳細につい ては以下を参照してください。

Winsock 2.x では二つのインタフェースを規定しています。アプリ ケーション開発者から下位層を隠蔽するアプリケーションプログラミン グインタフェース(API)と、Winsock のプロトコルスタックを透過的に 拡張することができるサービスプロバイダインタフェース(SPI)です。 API を正しく利用した Winsock アプリケーションは、さまざまな種類 のネットワークトランスポートプロトコルや、Winsock 実装の上で動作 することができます。

(なお、ほとんどの人は Winsock の現在のバージョンのことを指す ときに、単に「Winsock 2」と呼んでいます。これは最新のバージョン では単に編集上の修正と元の仕様の明確化がされているだけだからです。)

Winsock のプログラミングを行おうとしているのであれば、API 仕様を入 手しておいたほうが良いでしょう。

1.2 - Winsock と TCP/IP との違いは何ですか?

ネットワークはいくつかの層から成り立っています。ネットワーク の関係者はこれらの層をOSI のネットワークモデルで表現して説明します。

TCP/IP とはネットワークプロトコルの一つであり、OSI モデルでは 第3層から第4層を表しています。ネットワークプロトコルは、アドレッシング、データの転送、 ルーティング、ネットワーク越 しの論理的なコネクション、などのサービスを提供するものです。二つ のコンピュータ間で実行されているプログラムが通信を行うときには、 その二つのコンピュータは同じネットワークプロトコルを使用しなけれ ばなりません。よく使われるネットワークプロトコルとして他には、 Novell の IPX、3Com/IBM/Microsoft の NetBIOS、Apple の AppleTalk などがあります。TCP/IP は現在最も普及しているネットワークプロト コルであり、実質的にほぼ全てのコンピュータでサポートされています。

Winsock とは、Windows のプログラムが、どのネットワークプロト コルでもデータの送信をできるようにするための一つの API です。 Winsock には TCP/IP 上でしか動作しない関数(例えば gethostbyaddr())もありますが、Winsock 2 では他のネッ トワークプロトコルでも利用できる、より汎用的なバージョンの関数も 存在します。

1.3 - Winsock と TCP/IP についてはどんなニュースグループやメーリングリストがありますか?

主な Winsock のニュースグループには comp.os.ms-windows.programmer.tools.winsockalt.winsock.programming があります。これらのニュースグループでは、Windows 上のネットワー クプログラミングに関する話題をカバーしています。TCP/IP が普及し ているのでほとんどの質問は TCP/IP に関するものですが、その他のネッ トワークプロトコルに関する質問でも構いません。

TCP/IP に関する主要なニュースグループは comp.protocols.tcp-ip です。 ここは Winsock のニュースグループよりも広範囲の話題を扱っていま す。例えば、ネットワーク管理の方針や Unix 上でのネットワークプロ グラミング、DNS クライアント X と DNS サーバ Y 間の奇妙な動作、 などなど、Winsock とは全く関係のないものもあります。

また、Winsock 2 メー リングリストに参加しても良いかもしれません。あまり流量は多く ありませんが(一日10通かそこら)、本物の Winsock エキスパートが多 数参加しています。

もし電子メールプログラム(SMTP, POP, IMAP)や FTP プログラム、 ウェブ用のプログラム(HTTP)を実装しようとしているのであれば、 Craig Morrison 氏が準備してくれた いくつかのメーリングリスト へ参加してみるのも良いかもしれません。

もし上記のような有名なプロトコルやその他一般的な Internet プ ロトコルについて質問があれば、この FAQ の項目 にも有用なリソー スへのポインタがあります。

Usenet のニュースグループやメーリングリストに質問を投稿する前 に、同じような質問が以前にも出ていないか、関連するアーカイブを検 索してみましょう。ニュースグループやメーリングリストの読者にとっ ては、そういうことをしない人は非難される傾向にあります。なぜなら、 自分で答えを探せるはずのものをいちいち教えてあげるのは、彼らにとっ ては時間の無駄だからです。Winsock 2 メーリングリストの アーカイブ では 1996 年の中頃まで遡ることができます。Usenet についても いくつかアーカイブがありますが、最もポピュラーなものは Google のグループ でしょう。

1.4 - Winsock 2 メーリングリストを退会するにはどうすればよいのですか?

Click the following link and then send the email:

以下のリンクをクリックして、それに従ってメールを送ってくださ い。

Winsock 2 メーリングリストを退会する

1.5 - Winsock にはどんなバージョンがあるのですか?

Winsock の最新バージョン(2000.08.10 時点)は 2.2.2 です。これ は通常、単に「Winsock 2」と呼ばれます。というのは、後から出てき たリビジョンは、元々の仕様からは仕様の明確化と間違いの修正しかな されていないためです。他に利用されているメジャーバージョンは 1.1 ですが、これはほとんどのアプリケーションではこれでも十分です。 (Winsock 2 で何が追加されているかについては、以下 を参照して下さい。)

Windows 95 以降の全ての Windows には Winsock は付属しています。 また Windows 3.1 で利用できる Winsock もいくつか存在します。(そ の他の OS については 別の FAQ 記事 で触れています。) Windows 95 と Windows NT 3.x には Winsock 1.1 が付属しています。Windows 98、Windows ME、Windows NT 4.0、Windows 2000 には Winsock 2 が付属しています。

Windows 95 用の Winsock 2 アップデートは、Microsoft のウェブサイトから入手することができます。もしあなたの開発環 境も古いものであれば、おそらく Winsock 2 SDK も必要になるでしょ う。これは Win32 Platform SDK の一部として入手することができます。(残念ですが、 Winsock SDK だけを入手できる場所はもう存在しません。)

Windows 3.1 と Windows NT 3.x は、カーネルの制限により、 Winsock 1.1 しかサポートされません。

Windows 3.x には Winsock は付属していませんが、たくさんのアド オンが存在します。おそらく最も有名なものの二つは、Microsoft の Wolverine スタックと、Trumpet Winsock でしょう。 これらの二つの選択肢の間にはいくつかのトレードオフが存在します。 Wolverine はフリーであり、Windows for Workgroups 3.1 上でのみ動 作し、また LAN 接続のみを処理できます。Trumpet は低価格のシェア ウェアで、全ての Windows 3.1 系で動作し、また LAN、SLIP、PPP 接 続を行うことができます。

Windows 3.1 用のその他の選択肢として、16ビット版の Internet Explorer 4.0 をインストールするというものもあります。これは Evolt Browser Archive にあ ります。

もし Windows 3.1 上で Win32s を使って 32ビットプログラムを書 いているのであれば、16ビット版の WINSOCK.DLLが存在すれば 16ビッ ト呼び出しにサンクダウンする WSOCK32.DLL があります。私は Win32s を使って、32ビット版 Winsock プログラムを Trumpet Winsock および Microsoft の Wolverine スタック上で動作させるのに成功したことが あります。

単に Winsock DLL を他のマシンにコピーするだけでは動作しない、 ということは覚えておいてください。Winsock レイヤに関連するネット ワークスタックを完全にインストールしなくてはなりません。

1.6 - Winsock 2 にはあるけど Winsock 1.1 には無い、というものには何がありますか?

Winsock 2 での新しい機能で重要なものの一つには、複数種類のト ランスポートプロトコルが正式にサポートされたことがあります。 Winsock 1.1 でも本当は TCP/IP に限定されていたわけではないのです が、正式にサポートされると仕様に明記されたのは TCP/IP だけでした。 また、独自に他のトランスポートプロトコルの実装を行ったベンダもあ りましたが、各ベンダが他プロトコルのサポートを追加するための標準 的な方法は存在しませんでした。Winsock 2 では、OSI、Novell IPX/SPX、デジタル社の DECNet が、仕様上正式にサポートされていま すし、その他のプロトコルを標準的な方法で追加することも可能になり ました。またさらに重要なこととして、全てのトランスポートプロトコ ル上で修正無しで動作する、トランスポート非依存のプログラムを書く ことができる、ということがあります。

他の Winsock 2 での重要な機能として、Win32 の統一的 I/O 機構 と完全に統合されたことがあります。例えば、ソケットに対して recv() の代わりに Win32 API の ReadFile() を使うことが可能になっています。さらに重 要なこととして、Windows NT/2000 のオーバーラップ I/O がソケット に対しても使用できることになったということもあります。Windows 9x 上の Winsock 2 でもソケットに対するオーバーラップ I/O が実装され ていますが、Windows 9x カーネル自身はオーバーラップ I/O をサポー トしていないので、Winsock がエミュレートしています。

Winsock 2 ではまた、「階層型サービス提供」("Layered Service Providers")を可能にしています。これによって、セキュリティプラグ インのようなもの、例えば 「SSL サービス提供者」に入ってきたデー タを突如として自動的に暗号化してしまう、というようなかっこいいこ とがいろいろとできるようになります。

これらの他にも追加された仕様はたくさんあります。その全てにつ いては、sockets.com の Winsock 2 Overview のページで知ることができます。

1.7 - 仕様が次に改訂されるのはいつでしょうか?

現在のリビジョン(2.2.2)は当分長続きするだろうと思われます。 Microsoft が Winsock の新バージョンを作成せざるを得ない状況とし ては二つ考えられます。

  1. 新たなトランスポートプロトコルが誕生し、Microsoft がそれをサポートしようとしたとき。 現在は、Winsock は主要なトランスポートプロトコルは全てサポートしており、 TCP/IP のようなトップランナーを置き換えてしまいそうなラ イバルは今のところなさそうです。
  2. 現在利用されているネットワークプロトコルに大きな 変更が加えられたとき。 これは IPv6 が利用され始めれ ば起こることになるでしょう。なぜなら、特に全ての関数が sockaddr_inに依存しているために、Winsock レ ベルの機能で多くの変更が必要となるからです。

実際には Winsock は徐々に進化しており、Microsoft はこれらの変 更を Winsock 仕様としてドキュメント化していません。(MSDN におい ては記述がありますが。) Windows 98 と Windows 2000 においては、 Winsock にさまざまな新機能が追加されていて、今まで未実装だったオ プション機能が実装されていたり、Winsock に直接影響を与えないよう に新しい API(IP ヘルパーなど)を作成して機能を補完したりしていま す。これらの変更点は、一つに集めて Winsock 仕様書のような公式な ドキュメントで標準化されるのが望ましいです。

Winsock の次の大きな変更が行われそうな時期としては、Windows 2000 が置き換えられる頃があります。小生としては 2003 年頃にそれ が起こるのではないかと考えています。

1.8 - Winsock は DECNet、IPX/SPX などを喋ることはできますか?

Winsock 1.1 では TCP/IP しか実際のサポートは提供されていませ んでした。Microsoft と Novell、その他のいくつかのベンダは、 NetBIOS、IPX/SPX 、Winsock を通したその他のトランスポートプロト コルのサポートを提供していましたが、これらのサポートがWinsock 仕 様上において標準化されることはありませんでした。

Winsock 2 ではこの状況が変わり、DECNet、IPX/SPX、OSI トランス ポートプロトコルのサポートが標準的に提供されています。ATM のネイ ティブトランスポートについての Winsock サポートもほぼ正式なもの として存在すると聞いたことがあります。(ATMカードベンダからの Winsock アドオンが必要です。) その他の LAN/WAN トランスポートに ついても、需要があれば同様にサポートされるでしょう。


<< 序文 Winsock 初心者のための情報 >>
Last modified: $Id: general.html,v 1.6 2002/11/09 20:54:09 ksk Exp $ Go to the original FAQ page
< Go to the main FAQ page << Go to the Home Page