前回までの作成した、SimpleClientTransFile, SimpleServerTransFileに
クライアント側でのファイル受信機能を実装したプロジェクトを公開します。
要求応答については以下のものを追加しています。

// ファイル受信コマンド 要求/応答 // Client->Server CMD_RECV_FILE_SIZE_REQ 受信サイズ要求 CMD_RECV_FILE_START_REQ 受信開始要求 CMD_RECV_FILE_END_RES 送信完了要求に対する応答 CMD_RECV_FILE_ABORT_REQ 中断要求 // Server->Client CMD_RECV_FILE_SIZE_RES 受信サイズ要求に対する応答 CMD_RECV_FILE_ABORT_RES 中断要求に対する応答 CMD_RECV_FILE_ING ファイル受信中 CMD_RECV_FILE_END_REQ 受信完了要求

受信サイズ要求(CMD_RECV_FILE_SIZE_REQ)に対してのファイルサイズが正の値で
応答(CMD_RECV_FILE_SIZE_RES)があれば、サーバにファイルがあり、サーバからの
送信準備ができていることにします。
ファイルサイズ0の応答(CMD_RECV_FILE_SIZE_RES)があれば、サーバにファイルが
ないので受信は終了します。

クライアントでファイル受信の準備出来たら、ファイルサイズを入れた受信開始要求
(CMD_RECV_FILE_START_REQ)を送信します。
ファイルがオープンできないなどの理由でファイル受信の準備ができていないときは
ファイルサイズに0を入れた受信開始要求(CMD_RECV_FILE_START_REQ)を送信します。

サーバはファイルサイズに正の値が入った受信開始要求(CMD_RECV_FILE_START_REQ)を
受信したらファイルを読み込みデータをファイル受信中(CMD_RECV_FILE_ING)として
送信します。
クライアントはファイル受信中(CMD_RECV_FILE_ING)を受信したら、ファイルに書き
込みます。

最後までファイルを読み込んだら、サーバは完了したことを受信完了要求
(CMD_RECV_FILE_END_REQ)として送信します。
クライアントは受信完了要求(CMD_RECV_FILE_END_REQ)を受信したらファイルをクローズし
送信完了要求に対する応答(CMD_RECV_FILE_END_RES)を送信します。

これらを実現するためのパケットの定義はdefine.hに記述しています。
クライアント側のファイル受信機能はCRecvFileThread
サーバ側のファイル送信機能はCSendFileThread
として実装しています。
これらのクラスの構築と破棄はCSendRecvThredで行っています。

これらのプログラムの完全なプロジェクトは以下のリンクから入手できます
クライアント
 SimpleClientTransFile for Windows
 SimpleClientTransFile for Linux
サーバ
 SimpleServerTransFile for Windows
 SimpleServerTransFile for Linux

今回のシリーズでは、
 ・IPv4/IPv6の両方で動作させる
 ・WindowsとLinuxの両方で動作させるために、最小の違いで対応する
にポイントを置きました。

また今回作成したTCPプログラミングの基本的な考え方は
 ・TCPの送受信機能はCSendRecvThreadに実装する
 ・CSendRecvThredは受信データを受信リングバッファに格納する
 ・各機能(ファイル送信、ファイル受信、チャットメッセージ)はマルチスレッドの
  基本クラスから派生したクラスに実装する
 ・各機能は自身のリングバッファにあるパケットと遷移状態に従って処理を行う
 ・CSendRecvThreadは受信バッファにパケットが揃ったらコマンドに応じて各機能の
  クラスのリングバッファに格納する
 ・各機能からの送信データはCSendRecvThreadの送信リングバッファに格納する
というものです。
他にも、ネットワークプログラミングを実現するにはいろんな手法(考え方)があると
思いますが、今回は、様々な機能を実現するもとになれば良いと考えこの手法を
取りました。
新たな機能を追加してもCSendRecvThread自身は大きな変更を必要としないはずです。
新たな機能もシンプルに作れると思います。