前回作成したサーバーサイドプログラムは、クライアントが送信した文字列を画面へ表示するプログラムでした。
今回は、そのサーバーサイドプログラムへ文字列を送信するプログラムを書きます。
Visual Studio にて新しいプロジェクトを作成し、そちらに記述して下さい。


サーバーサイドプログラムと共通の関数を書いてみました。
実は、クライアントプログラムはサーバーサイドプログラムとほとんど変わりません。

SOCKADDR_IN構造体にてこちらでもServerInfoを作成しています。
この構造体へ格納するデータはサーバー側とあわせて下さい。
サーバーがどのようなネットワークの種類なのか、ポート番号とIPアドレスはなにかを指定するだけです。
また、クライアント側ではソケットを2つ作る必要はありません。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
それでは、クライアントならではの関数を紹介致しましょう。

connect関数は、サーバーへSYNを送信します。また、bindのようにソケットとSOCKADDR構造体の紐付けを行います。実はListenSYN ACKを返信します。
connectがうまくいくと、データを転送できる状態になります。

connectの第一引数へは、送信に使用するソケットを指定します。
connectの第二引数へは、サーバーの情報を格納したSOCKADDR構造体を指定します。前回話した通り、様々な事情からこのようなインターフェースとなっています。
connectの第三引数へは、第二引数のバイト単位のサイズを指定します。sizeof演算子を使えば良いです。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


実際のパケットを送信するにはsend関数を使用します。
sendの第一引数は、送信に使用するソケットを指定します。
sendの第二引数は、送信する文字列を指定します。
sendの第三引数は、送信する文字列の長さを指定します。strlen文字列の長さsizeof配列の長さを使用してもよいでしょう。
sendの第四引数は、sendの挙動を決めるオプションを指定するのですが、ルーティングテーブルの迂回や、バンド外データの送信など、ほとんど使わない機能なので通常は0を指定します
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
お疲れ様でした! これでクライアントソフトウェアの作成は完了です!
サーバーサイドプログラムを起動しつつ、クライアントプログラムを立ち上げてみて下さい。
17

ファイアウォールがアプリケーションをブロックします。今回のプログラムはローカルネットワークで運用するので、プライベートネットワーク(ローカルネットワーク)に許可をチェックしてアクセスを許可して下さい。
実用的なアプリケーションでは、パブリックネットワークを許可する必要があります。

もちろん同じPC内にサーバーサイドプログラムとクライアントプログラムは共存できます。

inet_addrのIPアドレスには、サーバーサイドプログラムもクライアントプログラムも同じローカルIPアドレスを指定して下さいね。

ローカルIPアドレスを調べるには、コマンドプロンプトからipconfigと打ちます。
3


ボクのデスクトップです。
13


実行結果
14

実行結果(サーバーサイドプログラムを拡大)
15

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
うまく動いた方はおめでとうございます。
うまく動かなかった方は、
IPアドレスの指定が間違っていないか、ポート番号の指定が間違っていないか……etc色々と確認してみて下さい。

IPアドレスが間違っている場合、例外が発生します。

もしWinSockのリンクそのものがうまくいかないのであれば、
黒翼猫のコンピュータ日記 2nd Edition #pragma commentでリンク指定しているのにリンクエラーになる問題
黒翼猫という方が詳しく解説しているのでそちらを参考に対処して下さい。

もちろん同じLAN内にあるコンピュータであれば、このプログラム達で通信が可能です。
PCを2台お持ちの方は、是非サーバーサイドプログラムと、クライアントプログラムをそれぞれのPCへ振り分けて実行してみて下さい。ボクはWin7のデスクトップとWin8.1のミニノートとWin10のゲーミングPCで確認しましたが、問題なく通信できました。