ファイル転送用のプログラム「FileTransfer」を制作しています・・・。
これから配布する準備とバグの修正を行っていくつもりです。
仕様
- TCP を使用
- 独自プロトコルを使用
- UTF8文字コードを使用
プロトコル
*ヘッダー部 ファイルヘッダー (i) ファイル名 (x) ファイルサイズ (x) *サブヘッダー部 sha256ヘッダー (i) sha256 (x) *ボディー *空データ
ヘッダー部
ファイルヘッダーには バイトサイズ を格納します。
ファイル名には UTF8エンコードされたファイル名が格納されます。
ファイルサイズには ファイルのサイズが格納されます。
サブヘッダー部
sha256ヘッダーには バイトサイズを格納します。
sha256 には sha256 エンコードしたデータを格納します。
ボディー部
バッファサイズ (1024) 読み取り書き込みます。
読み込みデータが 0 になった時点で読み込みを終了します。
読み込んだデータがバッファサイズに満たなかった場合
残りのデータを 255 で埋めます。
空データ部
255 で埋められたデータを送信します。
技術仕様
ヘッダー部、サブヘッダー部で使用するバイトサイズは可変配列を使用しているため受信側で対応する必要があります。
基本サイズが「256」なので2倍になれば「512」になります。
MemoryStream を使用し、読み込みが完了するまで読み込んだデータを一時的に保存します。
using (MemoryStream ms = new MemoryStream()) { bool end = false; while (!end) { // データ読み込み byte[] fSize = new byte[256/* Global.BUF_HEAD_SIZE */]; stream.Read(header, 0, header.Length); // 一時保存 ms.Write(header, 0, header.Length); for (int i = 0; i < header.Length; i++) { // 終了フラグ if (header[i] == byte.MaxValue) { // 終了する // データの初めまで移動して読み込む tmp = new byte[(int)ms.Length]; ms.Seek(0, SeekOrigin.Begin); ms.Read(tmp, 0, (int)ms.Length); end = true; break; } } // 必要なのが 1block であれば //end = true; } }
復元は
int size = BitConverter.ToInt16(tmp, 0);
で行います。
sha256 の必要性
ネットワークを介したデータのやり取りでは必ずロスなどの問題が起きます。
データが正しく送れているか受け取れているか確認するためにもあった方がいいでしょう。
UDPのようにリアルタイム性のあるもの、なおかつ破損しても問題ないデータであれば別ですが。