1.5 Windows プログラマへの注意事項

このガイドの時点では、歴史的に、私が Windows をあまり好きではないという事実のために、Windows を少し非難しています。しかし、Windows は膨大なインストールベースがあり、明らかに完璧なオペレーティングシステムであることを公平にお伝えする必要があります。

不在は心を豊かにすると言いますが、この場合、私はそれが真実であると信じています。(ただ、言えることは、10数年前から個人的な仕事ではマイクロソフトの OS を使っていなかったので、ずっと幸せだということです だから、安心して、"どうぞ、ご自由に Windows を使ってください!" と言えるのです。 ...そう、歯ぎしりしながら言うんですけどね。

ですから私は、LinuxBSD、あるいは Unix のいくつかのフレーバーを、代わりに試してみることをお勧めします。

しかし、人は好きなものを好きになるものです。Windows の皆さんは、この情報が、もしあれば、いくつかの小さな変更を加えて、あなた方にも一般的に適用できることを知って喜んでいることでしょう。

Windows 用の Unix ツールの集合体である Cygwin をインストールするのもいい方法です。そうすると、これらのプログラムはすべて修正なしでコンパイルできるようになると、人づてに聞いたことがあります。

もうひとつ、Windows Subsystem for Linux も検討してみてください。これは基本的に、Windows 10 に Linux の VM 的なものをインストールすることができます。これもまた、間違いなく位置づけられるでしょう。

しかし、中には純粋な Windows のやり方で物事を進めたいと思う人もいるかもしれません。それはとてもガッツのあることで、こうすればいいんです。すぐに Unix を買ってきてください! いやいや---冗談です。最近は Windows フレンドリー(笑)なはずなんですが...。

これは、あなたがしなければならないことです(Cygwinをインストールしない限り!):まず、ここで私が言及するシステムヘッダーファイルのほとんどを無視してください。あなたがインクルードする必要があるのは、以下のものだけです。

#include <winsock.h>

待ってください!ソケットライブラリで何かする前に WSAStartup() を呼び出す必要があります。これを行うためのコードは以下のようなものです。

#include <winsock.h>

{
    WSADATA wsaData;   // if this doesn't work
    //WSAData wsaData; // then try this instead

    // MAKEWORD(1,1) for Winsock 1.1, MAKEWORD(2,0) for Winsock 2.0:

    if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) {
        fprintf(stderr, "WSAStartup failed.\n");
        exit(1);
    }

また、Winsock ライブラリをリンクするようにコンパイラに指示する必要があります。通常、wsock32.lib または winsock32.lib、Winsock 2.0 の場合は ws2_32.lib と呼ばれます。VC++ では、これは Project メニューの Settings... から行うことができます。Link タブをクリックし、"Object/library modules" というタイトルのボックスを探します。そのリストに "wsock32.lib"(または、お好みの lib)を追加してください。

とか聞いています。

最後に、ソケットライブラリを使い終わったら、WSACleanup() を呼び出す必要があります。詳しくはオンラインヘルプを参照してください。

一度これを行えば、このチュートリアルの残りの例は、いくつかの例外を除いて、概ね適用できるはずです。ひとつは、ソケットを閉じるために close() を使うことができません。また、select() はソケット記述子に対してのみ動作し、ファイル記述子に対しては動作しません(stdin に対する 0 のように)。

また、CSocket というソケットクラスもあります。詳細はコンパイラのヘルプを参照してください。

Winsock についての詳しい情報は、Winsock FAQ を読んで、そこから進んでください。

最後に、Windows には fork() システムコールがないそうですが、これは残念ながら私の例のいくつかで使われているものです。多分、POSIX ライブラリか何かをリンクしないと動かないでしょうし、代わりに CreateProcess() を使ってもいいでしょう。fork() は引数を取らず、CreateProcess() は約480億の引数を取ります。もし、そこまで気が回らないのであれば、CreateThread() の方が少し消化しやすいでしょう。残念ながら、マルチスレッドに関する議論はこのドキュメントの範囲外です。私が語れることは限られているのですからね!