Windowsでソケット通信を行いたい人は・・・いないと思いますけど、どんなものか知っておいても良いかも?
実際に動きを見ながら解説したいと思いますので、ぜひご覧になっていってください。
概要
WinSock:Windowsソケット通信
Windowsソケット通信とは、データをPC間で送受信するのに利用します。
どんな構成になっているのか、また実際に動きを見ながら解説していきたいと思います。
動きを見ながらの解説なのでイメージは掴みやすいと思いますので是非チャレンジしてみてください。
必要な構成
- サーバ
- クライアント
サーバは、PC1台のみ
クライアントは、PC複数台可
インターネットの話でも、サーバとクライアントの関係性についてキーワードであがります。
サーバとクライアントとは、親と子の関係になります。
ハードウェア接続の「ホスト」と「デバイス」も親と子の関係になりますが、こちらのほうが、イメージしやすいかもしれません。
- サーバ・・・ホスト=PC本体。の意味に近いかも
- クライアント・・・デバイス=USBマウスやキーボード等。の意味に近いかも
例)データ送受信内容
- USBキーボード:データは、入力したキーの内容
- USBマウス:データは、マウス操作の内容
- USBメモリ:データは、ファイルの内容
前提
WinSockは、前提としてまず、サーバとクライアントの構成を確立しないとデータのやりとりができないものと思ってください。
※以降、これらの関係を、サーバ、クライアントと表現して記載します。
実際の動きを見てみる
まぁ、文字でごにょごにょ説明するよりかは、実際に動きを見てみたほうが早い。
使用するフリーソフト
使用するアプリは何でもいいのですが、ここではフリーの「ソケット通信 Data Viewer SockV」を使用した例で解説したいと思います。
個人的には、直観的に使えてわかりやすいと思いましたのでこのソフトを使用させて頂きました。
https://www.vector.co.jp/soft/winnt/net/se484231.html
zipファイルを好きな所に解凍したら準備完了です。
(インストールとかはありません)
操作手順
PC2台用意(ローカルネットワーク環境が整った)
無ければ1台でもOKです。
それぞれのPCで、SockV.exeを起動
PC1台で確認する場合は、exeを2個起動してください。
サーバの設定
1つ目のexeには、サーバに設定します。
- 「TCP Server」を選択
- Host IPは、設定不可(設定不要)
- Host Portは、設定不可(設定不要)
- Local Portは、適当に「7500」としました。
サーバの設定は、自分自身のPCが対象なので、特に相手のPC(IPアドレス)とかは、気にする必要はありません。
そのため画面の通り「Host IP」「Host Port」の設定は不要というわけです。
自身のポート番号「Local Port」だけ気にすれば良いということになります。
クライアントの設定
2つ目のexeには、クライアントを設定します。
- 「TCP Client」を選択
- Host IPは、上記サーバに設定したPCのIPアドレスを入力します。192.168.x.xxxみたいな。(1台で確認している場合、「localhost」と入力でもOK)
- Host Portは、上記サーバPCの「Local Port」と同じ番号を入力。(今回の例では、7500)
- Local Portは、設定不可(設定不要)
※自身のIPアドレスの見方は、コマンドプロンプト上で、「ipconfig」と入力すると確認できます。
クライアントは、サーバがいないと生きていけないので、サーバ側の情報を設定するイメージです。
そのため画面の通り、サーバ(接続先のPC)のIPアドレス「Host IP」と、ポート番号「Host Port」の設定は必須です。
自身のポート番号「Local Port」は、気にする必要はないということです。(正確には自動で番号が割振られる)
準備は整いました。あとは実行するだけ
「TCP Server」(サーバPC)側で、「Create」ボタンを押します。
下のリストに、赤色のディスプレイアイコンの項目が追加されます。
これは、サーバが作成されたことを表してます。
「ソケット」とは、この「ディスプレイアイコンのこと」をイメージして頂ければと思います。
「TCP Client」(クライアントPC)側で、「Create」ボタンを押します。
下のリストに、水色のディスプレイアイコンの項目が追加されます。
サーバ側の下のリストにも水色のディスプレイアイコンの項目が追加されます。
データの送受信
データの送受信を試してみましょう。
サーバのエディットボックス上側に適当に文字を入力します。「abcdefg」
送信指示ダイアログで、送信ボタンを押します。
送信指示ダイアログの表示方法は、メニュー[通信]-[送信指示ダイアログ]を選択してください。
「abcdefg」と表示されました。
これでサーバからのデータをクライアント側で受信できた形となります。
クライアント側のエディットボックス下側に「61 62 63 64 65 66 67」と表示された場合ですが、これは16進数で表示されているだけです。ツールバーの中に、「HEX/CHR/TXT」とあるので、「TXT」を選択してください。
今度は、クライアント側からの送信を試してみましょう。
クライアントのエディットボックス上側に適当に文字を入力します。「xyz123」
送信指示ダイアログで、送信ボタンを押します。
サーバ側のエディットボックス下側に、HEX表記では「78 79 7a 31 32 33」、TXT表記では「xyz123」と表示されます。
これでクライアントからのデータをサーバ側で受信できた形となります。
この状態のまま、クライアントをもう1台追加してみる。
最初の説明で、クライアントは「複数台可」と言いましたので、クライアントをもう1台追加して試してみましょう。
設定/追加内容は、前述のクライアントと同じになります。
PCもう1台用意(ローカルネットワーク環境が整った)
無ければ1台でもOK。
SockV.exeを追加で起動
PC1台で動かしている場合、exe2個起動中だったのを、もうひとつexeを起動して、計3個起動していることになります。
もう1台のクライアントを設定します。
- 「TCP Client」を選択
- Host IPは、上記サーバに設定したPCのIPアドレスを入力します。
- Host Portは、上記サーバPCの「Local Port」と同じ番号を入力。(今回の例では、7500)
- Local Portは、設定不可(設定不要)
2台目のクライアントで、「Create」ボタンを押します。
下のリストに、水色のディスプレイアイコンの項目が追加されます。
(サーバ側の下のリストにも水色のディスプレイアイコンの項目が追加されます。)
エラーメッセージが出たら、ネットワーク配線されていないとか、設定が間違っているとかなので、見直してみてください。
サーバ側からデータ送信
サーバのエディットボックス上側に適当に文字を入力して送信してみます。「123abc」
クライアント側のエディットボックス下側にHEX表記では「31 32 33 61 62 63」、TXT表記では「123abc」と表示され受信できていることが確認できました。
今度は、さきほど追加したクライアントのエディットボックス上側に適当に文字を入力して送信してみます。「456def」
サーバ側のエディットボックス下側にHEX表記では「34 35 36 64 65 66」、TXT表記では「456def」と表示され受信できていることが確認できました。
TCP通信は1対1
お気づきと思いますが、1台目のクライアントにはサーバの送信データが受信されておりません。
サーバ側をよくみると、下のリスト内にある1台目のクライアントのディスプレイアイコンが「グレー色」になってます。
(実は新しいクライアントを追加したタイミングで、1台目のクライアントとは切断されておりました。)
これは、サーバ側からデータ送信するときは、1つのクライアントしか選べないという事になります。
ですので、対象のソケット(送信先のクライアント)を選んでから送信する必要があります。
余談:ちなみに、送信先を選ばずに、全員に送信したい場合は、「ブロードキャスト」と呼ばれる手法で行います。この場合は、UDPという通信フォーマットでしか行えません。これはまた別の機会にでも。
(今回の解説では、TCP(Transmission Control Protocol)という通信フォーマットでした。)
最後に
概要の解説は以上です。
動かしてみてなんとなくイメージは掴めたのではないでしょうか。
ソケット通信は、他のPCとデータやりとりするイメージが強いかもしれませんが、
実際に1台だけで動かしてみてもわかる通り、同じPC内でもデータのやりとりが出来たりします。
同じPCであれば、わざわざ送受信しなくても、共有メモリで各々のアプリでデータを見れるようにする形にすることも出来ますし、Windowsメッセージをトリガー扱いで利用するという手段もありますので、用途に合わせて使い分けするのもよいかもしれません。
正直、Windowsソケット通信は、いまどきのお仕事で触れる機会はほぼないと思います。
専門的なところで稀に関わるぐらいで、薄い・細い範囲の分野にあたります。
それでもどんなものかぐらいは把握しておいても良いかなと思います。
気が向いたら次回はサンプルプログラムの解説をしたいと思います。
最後まで見てくれてありがとう。