WinSock/MSDNソケットコードの解説

MSDNの完成形プログラムの概要 編集

MSDNのあれは何か 編集

MSDNにWinsockの完全形(complete)と称するプログラムがあるが、アレはナニをやるプログラムかを大まかに説明する。

もし、リンク先が内容変更したり消失したりした場合は、下記の場所に控えを保管してある。

WinSock/MSDNのソケットコードの保管場所


これらのプログラムは、総合的には、 あなたの手元のパソコンにローカルなサーバー(とりあえず「ローカルサーバー」と言おう)を立てて、 そのローカルサーバーとデータを送受信するクライアントアプリを作っている。


なので、クライアント側アプリを作る前に、先にサーバー側プログラムを作っておかないと、クライアント側を実行しても(相手先のサーバーが無いので)通信エラー扱いで終了になる。

とはいえ、サーバー側はあなたの手元の今見てるローカルPCで、MSDNにある当のサーバー用プログラムを実行するだけで、ローカルサーバーが立つ。


一般に、ウィンドウズにかぎらずLinux(リナックス)などでも、

一般に何かサーバーを立てるときに、手元のパソコン内にローカルなサーバープログラムを立てる機能がある。そして、その手元のパソコン内のローカルなサーバーには、その手元のパソコンでのOS内の別プログラムからアクセス可能である。


俗(ぞく)に、こうして立てられた手元のサーバーのことを「ローカルホスト」(localhost)という。

なので、まず、そのローカルホストのサーバーを立てる必要があり、そのためにローカルホスト(ローカルサーバー)のプログラムを実行する必要がある。

実行すると何が起きるか 編集

さて、とにかく、MSDNをコピーペーストしてコンパイルして、

クライアント側アプリの実行ファイルを作成し、

また、別途、

サーバー側アプリの実行ファイルも作成する。


両方と作成したとしたら、次の作業に取り掛かるだけでいい。

  1. クライアント側アプリより先にローカルサーバーを実行する。
  2. 念のため、十数秒ほど放置する。
  3. そのあと、クライアント側アプリを実行すると、送受信してクライアント側が自動終了する。
  4. サーバー側を見ると、クライアント側との通信記録があるハズなので、それをあなたが閲覧して、正常動作したことを確認しよう。


実行結果
Bytes received: 14
Bytes sent: 14
Connection closing...

C:\Users\ユーザー名\source\repos\Project5\Debug\Project5.exe (プロセス 3032) は、コード
0 で終了しました。
デバッグが停止したときに自動的にコンソールを閉じるには、[ツール] -> [オプション]
 -> [デバッグ] -> [デバッグの停止時に自動的にコンソールを閉じる] を有効にします
。
このウィンドウを閉じるには、任意のキーを押してください...

上記のような実行結果が、サーバー側プログラムから起動したコマンド端末画面(DOSプロンプト)に表示される。


操作方法の解説 編集

上記のMSDNコードの環境構築など 編集

まず、Visual Studio を立ち上げる(Visual Studioでないとコンパイルが困難または不可能なので)。

そして、これからサーバ用のプロジェクトと、クライアントのプロジェクトをそれそれ作る。(Visual Studioによるコード作成の際に勝手にプロジェクト名をダイアログ形式で聞いてくるので、質問に答えてプロジェクト名を入力していけばいい。

プロジェクトは、サーバ用とクライアントを別個に作るほうが、あとの管理がラクである。


先にサーバ用のプロジェクトを作るほうがラクである。


画面上部のツールバーにある「Debug」「X86」みたいな欄の「Debug」を、となりの下向き▼ボタンを押して変更して「Releasr」に変更する。

Debugで生成される実行ファイルというのは、デバッグ用にVisual Studio から起動したりするぶんには操作が早いのだが、それ以外の環境で実行する場合に、やや問題がある。

なので、一般の実行ファイルとして、Release に変更したほうが安全である。


そして、まず上記の2個のコードを、それぞれのプロジェクトのソースコードに記述してから、それぞれReleaseに設定してから、メニュー欄のビルド系のコマンドで別個に実行ファイルを作る。

ただし、クライアント側のコードがMSDNの2018年の内容は古くなって動作しないので、更新として、節の末尾で示した方法で更新のこと。

メニューバーの「ビルド」>「ソリューションのリビルド」によって、

プロジェクト内のフォルダに、それぞれ実行ファイルが作成される。


なお、

「ソリューションのリビルド」と、
「ソリューションのビルド」という、

似たようなメニューコマンドがあるが、リビルドのほうが正確にコンパイルしてくれる。 リの付いていない単なるビルドは、Visual Studio の場合、差分的なビルドであり、変更点だけを検出してビルドすることでビルド時間などを短縮したりの機能があるようだが、しかしときどき不正確な検出をしているようであり、正しくビルドが行われない場合がある。(「リビルド」だとコンパイルできるコードが、「ビルド」だろときどきコンパイルがエラーになったり、あるいは実行結果が不正確だったりする場合がある。)

上述の程度の長さのコードだったら、リビルドをなるべく普段から使うようにしたほうが安全である。


ここまで住んだら、あとはサーバ側の実行ファイルを先にダブルクリックすれば、あとはもうVisual Studio が無くてもダブルクリックだけ(ローカルの)サーバが立ち上がる。

このあと、クライアント側の実行ファイルを立ち上げて、通信が行われているのを確認すればいい。


実行結果

ユーザー名やプロジェクト名(下記では sockTestClient )などの部分は、個々人の設定によって表示結果が変わるが、おおむね下記のように

「Bytes Sent: 14」

とか表示されれば成功である。

Bytes Sent: 14
Bytes received: 14
Connection closed

C:\Users\ユーザー名\source\repos\sockTestClient\Release\sockTestClient.exe (プロセス 652
8) は、コード 0 で終了しました。
デバッグが停止したときに自動的にコンソールを閉じるには、[ツール] -> [オプション]
 -> [デバッグ] -> [デバッグの停止時に自動的にコンソールを閉じる] を有効にします
。
このウィンドウを閉じるには、任意のキーを押してください...