1 Intro #
おいおい、ソケットプログラミングで参ってるのか?このようなことは man
ページから理解するには少し難しすぎるのではありませんか?クールなインターネットプログラミングをしたいけど、connect()
の前に bind()
を呼ばないといけないのか、などなど、struct
のゴブをかき分けている時間はないでしょう。
さて、どうでしょう!?私はもうこの厄介なビジネスをやり遂げました。そして、この情報をみんなと共有したくてたまらないのです! あなたは正しい場所に来たのです。この文書は、平均的な有能なCプログラマーが、このネットワーク・ノイズに対処するために必要なエッジを与えてくれるはずです。
そして、チェックしてみてください。私はついに未来に追いつき、(ちょうどいいタイミングで!)IPv6用にガイドを更新しました。お楽しみに!
1.1 Audience #
このドキュメントは、完全なリファレンスではなく、チュートリアルとして書かれています。 ソケットプログラミングを始めたばかりで、足がかりを探している人が読むと、おそらく最適なものになるでしょう。ソケットプログラミングの完全なガイドではありません。
でも、うまくいけば、あのマニュアルページが意味を持ち始めるかもしれませんね…。:-)
1.2 Platform and Compiler #
この文書に含まれるコードは、Gnu の gcc
コンパイラを使用して Linux PC でコンパイルされています。しかし、gcc
を使うプラットフォームであれば、ほぼ全てのプラットフォームでビルドできるはずです。当然ながら、Windows用のプログラミングには適用されません。以下の
section on Windows programmingを参照してください。
1.3 Official Homepage and Books For Sale #
このドキュメントの正式な所在地は
また、サンプルコードや様々な言語への翻訳も掲載されています。
製本された印刷物(“本"と呼ぶ人もいる)を購入するには、以下をご覧ください。
文書作成生活の維持に役立つので、購入はありがたいです!
1.4 Note for Solaris/SunOS Programmers #
Solaris または SunOS 用にコンパイルする場合、適切なライブラリをリンクするために、いくつかの特別なコマンドラインスイッチを指定する必要があります。これを行うには、コンパイルコマンドの最後に “-lnsl -lsocket -lresolv
” を以下のように追加するだけです。
$ cc -o server server.c -lnsl -lsocket -lresolv
それでもエラーが出るようなら、さらにそのコマンドラインの最後に -lxnet
を追加してみるといいでしょう。それが何をするのか正確にはわかりませんが、必要な人もいるようです。
もう一つ問題がありそうなのは、setsockopt()
の呼び出しのところです。プロトタイプは私の Linux ボックスのものとは異なるので、代わりに
int yes=1;
char yes='1';
を入力します。
私は Sunbox を持っていないので、上記の情報を検証したわけではありません—あくまでメールで教えてもらったことです。
1.5 Note for Windows Programmers #
このガイドの時点では、歴史的に、私が Windows をあまり好きではないという事実のために、Windows を少し非難しています。しかし、Windows は膨大なインストールベースがあり、明らかに完璧なオペレーティングシステムであることを公平にお伝えする必要があります。
不在は心を豊かにすると言いますが、この場合、私はそれが真実であると信じています。(ただ、言えることは、10数年前から個人的な仕事ではマイクロソフトのOSを使っていなかったので、ずっと幸せだということです だから、安心して、“どうぞ、ご自由に Windows を使ってください!“と言えるのです。 …そう、歯ぎしりしながら言うんですけどね。
ですから私は、 Linux や BSD、あるいは 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()
の方が少し消化しやすいでしょう。残念ながら、マルチスレッドに関する議論はこのドキュメントの範囲外です。私が語れることは限られているのですからね!
1.6 Email Policy #
メールでの質問には基本的に対応しますので、気軽に書き込んでください。ただし、返事を保証するものではありません。私はかなり忙しい生活を送っているので、どうしても質問に答えられないことがあります。そのような場合は、メッセージを削除します。個人的なことではなく、あなたが必要とする詳細な回答をする時間がないだけなのです。
原則として、質問が複雑であればあるほど、回答できる可能性は低くなります。質問を送る前に質問を絞り込み、関連する情報(プラットフォーム、コンパイラ、表示されるエラーメッセージなど、トラブルシューティングに役立ちそうなもの)を必ず記載していただければ、回答が得られる可能性は高くなります。より詳しい情報は、ESRのドキュメント、 How To Ask Questions The Smart Way をお読みください。
返事がない場合は、もう少し調べてみて、答えが見つからなければ、また調べてみてください。そして調べたことまたを書き込んでください。その結果、私がお手伝いできるようになることを期待しています。
さて、手紙の書き方、書き方についておせっかいを焼いてしまいましたが、このガイドが何年にもわたって賞賛されてきたことに、私は十分に感謝していることをお伝えしておきたいと思います。このガイドが良いことに使われていると聞いて、私はとても嬉しくなりました。:-)
ありがとうございます。
1.7 Mirroring #
このサイトをミラーリングすることは、公的にも私的にも大歓迎です。もし、あなたがこのサイトを公的にミラーリングし、メインページからリンクしてほしい場合は、beej@beej.us
までご連絡ください。
1.8 Note for Translators #
もし、このガイドを他の言語に翻訳したい場合は、beej@beej.us
までメールをいただければ、メインページからあなたの翻訳をリンクさせていただきます。翻訳にはあなたの名前と連絡先を自由に追加してください。
このソースマークダウン文書は UTF-8 エンコーディングを使用しています。
後述の Copyright, Distribution, and Legal に記載されている使用許諾条件にご注意ください。
もし私に翻訳をホストして欲しいのであれば、言ってください。また、あなたがホストすることを望むなら、私はそれにリンクします;どちらでも構いません。
1.9 Copyright, Distribution, and Legal #
Beej’s Guide to Network Programming is Copyright © 2019 Brian “Beej Jorgensen” Hall.
この作品は、以下のソースコードと翻訳に関する特定の例外を除き、クリエイティブ・コモンズ 表示-非営利-改変禁止 3.0 ライセンスの下に提供されています。このライセンスのコピーを見るには、以下をご覧ください。
https://creativecommons.org/licenses/by-nc-nd/3.0/
または、Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USAに手紙を送ってください。
本使用許諾の"二次的著作物の禁止"部分の具体的な例外は、次のとおりです:このガイドは、翻訳が正確である限り、どの言語にも自由に翻訳でき、ガイド全体を再印刷することができます。翻訳には、オリジナルのガイドと同じライセンスの制約が適用されます。翻訳には、翻訳者の名前と連絡先も含めることができます。
本書で紹介する C 言語のソースコードは、パブリックドメインとして許諾され、いかなるライセンス制限もありません。
教育関係者は、このガイドを生徒に勧めたり、コピーを提供したりすることを自由に推奨します。
書面による相互の合意がない限り、著者は作品を現状のまま提供し、作品に関して、明示的、黙示的、法定またはその他のいかなる種類の表明または保証(権利、商品性、特定目的への適合性、非侵害、潜在的またはその他の欠陥の不在、精度、または発見可能かどうかにかかわらず誤りの有無の保証を含むが、これに限定されない)も行わないものとします。
適用される法律で要求される範囲を除き、いかなる場合においても、著作者は、著作物の使用から生じる特別損害、付随的損害、結果的損害、懲罰的損害または典型的損害について、たとえ著作者がその損害の可能性を知らされていたとしても、いかなる法的理論によってもお客様に対して責任を負うことはないものとします。
お問い合わせは beej@beej.us
までお願いします。
1.10 Dedication #
このガイドを書くにあたり、過去から未来にわたって協力してくださった皆様に感謝します。そして、私がこのガイドを作るために使っているフリーソフトやパッケージを制作しているすべての人に感謝します。GNU、Linux、Slackware、vim、Python、Inkscape、pandoc、その他多数。そして最後に、文字通り何千もの人々が、改善の提案や励ましの言葉を書いてくれたことに、大きな感謝を捧げます。
このガイドを、コンピュータの世界における私の最大のヒーローであり、インスピレーターである何人かに捧げます。Donald Knuth、Bruce Schneier、W. Richard Stevens、The Woz、そして私の読者、さらにフリーおよびオープンソースソフトウェアのコミュニティ全体に捧げます。
1.11 Publishing Information #
この本は、GNU ツールを搭載した Arch Linux のマシン上で vim エディタを使って、Markdown で書かれています。表紙の"アート"とダイアグラムは Inkscape で作成されています。Markdown は Python、Pandoc および XeLaTeX により、Liberation フォントを用いて HTML および LaTex/PDF に変換されます。このツールチェーンは 100% フリーおよびオープンソースソフトウェアで構成されています。