クライアント側(SimpleClient)
先ずは単純なクライアントを作ります。
マルチスレッド化などは、後程この単純なクライアントを元に考えることにします。
次のような機能を実現します。
起動引数:サーバアドレス サーバポート番号
ここで指定したサーバにポート番号で接続要求をします。
接続が成功したら次のメニューを表示します。
失敗したら終了
q:quit m:メッセージ送信 :
‘q’入力でプログラム終了
‘m’入力で文字列入力モードへ移行
送信メッセージを入力してください :
文字列[ENTER]で入力された文字列をサーバに送信します。

C:\Products\SimpleClient\x64\Debug>SimpleClient fe80::11a0:ecd4:2cf8:6e5c 10000 q:quit m:メッセージ送信 : 送信メッセージを入力してください : Hello

SimpleClientでは、ソケットAPIを使用する関数を次のような関数にまとめることにします

CreateAndConnectSocket関数では、次のソケットAPIを使用します。
この関数では指定されたサーバに対するアドレス情報(IPv4, IPv6と複数ある場合も
あります)に対してソケットを作成し、順番に接続処理を行い成功したら、そのソケット
を使って送受処理を行います。
SOCKET socket(int af, int type, int protocol);
ソケットを作成します。
通信のための端点 (endpoint) を作成し、 ディスクリプターを返します。
af, type, protocolの指定には接続先サーバを指定してgetaddrinfoを呼んだ
結果を使用します。
SimpleClientではここで作ったソケットを使って接続処理もデータの
送受信処理も行います。
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
ソケットの接続処理を行います。
ファイルディスクリプター sockfd が参照しているソケットを使って addr で指定された
アドレスに接続処理を行います。

DoSend関数では、次のソケットAPIを使用します。
int send(int sockfd, const void *buf, size_t len, int flags);
接続済みソケットsockfdにデータ送信を行います。
sendは、ソケットが 接続された (connected) 状態にある場合にのみ使用できます。
sendはブロックするので、呼び出す前に送信可能かどうかをselectを 使って
調べることにします。

DestroySocket関数では、次のソケットAPIを使用します。
int shutdown(SOCKET sockfd, int how);
ソケットの破棄
sockfd に関連づけられているソケットによる全二重接続 (full-duplex
connection)の一部または全てを閉じます。
ここでは、送受信を閉じるため次の値を設定します。
WindowsではhowにSD_BOTHを設定します。
LinuxではhowにSHUT_RDWRを設定します。
int closesocket(SOCKET sockfd); Windows用
int close(SOCKET sockfd); Linux用
ソケットディスクリプターをクローズします 。

以上のことを念頭に実際のプログラムを作ることにします。
作成は、次回ということで。。。