/// <summary> /// читает одно сообщение от клиента /// </summary> /// <param name="client"></param> /// <returns></returns> private byte[] ReadMessage() { byte[] buffer; bool nullBuff; do { nullBuff = false; byte[] btSize = new byte[4]; int bufPos = 0; try { CryRd.Read(btSize, 0, 4); buffer = new byte[ToInt(btSize)]; do { int bufSize = 1048576; if (bufSize > buffer.Length - bufPos) { bufSize = buffer.Length - bufPos; } bufPos += CryRd.Read(buffer, bufPos, bufSize); } while (buffer.Length - bufPos != 0); if (buffer.Length > 4) { if (buffer[4] == 0) { nullBuff = true; } } } catch (SocketException) { //MessageBox.Show(e.Message); buffer = null; } catch (CryptographicException) { //MessageBox.Show(e.Message); buffer = null; } catch (IOException) { //MessageBox.Show(e.Message); buffer = null; } } while (nullBuff); return(buffer); }
/// <summary> /// Запрашивает архив с сервера /// </summary> /// <param name="path">путь, куда будет распакован и расшифрован файл</param> /// <param name="name">имя файла</param> public void SRVGetFile(FrmWait frmWait, string path, string name) { if (MyKey == null) { MessageBox.Show("Введите пароль"); return; } // сразу проверим, сможем ли мы записать в файл данные, иначе скачивать бессмысленно if (File.Exists(path)) { if ((File.GetAttributes(path) != FileAttributes.Normal) && (File.GetAttributes(path) != FileAttributes.Archive)) { MessageBox.Show("Невозможно перезаписать файл"); return; } } SendResponse("GET ", name); while (lastRec == null) { Thread.Sleep(100); } int tmpSize = 10 * 2; //берём в строку только первые 10 символов if (tmpSize > lastRec.Length) { tmpSize = lastRec.Length; //или сколько там этих символов есть в сообщении } string tmpStr = Encoding.Unicode.GetString(lastRec, 0, tmpSize); string command = tmpStr.Split(' ')[0]; int posData; int sizeFile; byte[] ThisKey; if (command == "FILE") { ThisKey = MyKey; sizeFile = ToInt(lastRec, 5 * 2); //размер файла posData = 5 * 2 + 4; } else if (command == "FILEPSWD") { ThisKey = new byte[0x20]; for (int i = 0; i < 0x20; i++) { ThisKey[i] = lastRec[9 * 2 + i]; } sizeFile = ToInt(lastRec, 9 * 2 + 0x20); //размер файла posData = 9 * 2 + 4 + 0x20; } else { frmWait.End(); lastRec = null; MessageBox.Show("Не удалось скачать файл"); return; } try { using (FileStream inFS = File.Create(path)) { using (RijndaelManaged rijAlg = new RijndaelManaged()) { rijAlg.Key = ThisKey; rijAlg.IV = MyIV; ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV); using (CryptoStream csDecrypt = new CryptoStream(inFS, decryptor, CryptoStreamMode.Write)) { MemoryStream msInp = new MemoryStream(lastRec, posData, lastRec.Length - posData); FileStream fsTemp = File.Create(path + ".tmp"); byte[] bfsize = new byte[4]; CryRd.Read(bfsize, 0, 4); int allFileSize = ToInt(bfsize); int rec = 0; while (rec < allFileSize) { int bufSize = Math.Min(1048576, allFileSize - rec); byte[] bufFile = new byte[bufSize]; CryRd.Read(bufFile, 0, bufSize); fsTemp.Write(bufFile, 0, bufSize); rec += bufSize; } fsTemp.Seek(0, SeekOrigin.Begin); msInp.Seek(0, SeekOrigin.Begin); ZipStorer zip = ZipStorer.Open(fsTemp, FileAccess.Read); List <ZipStorer.ZipFileEntry> dir = zip.ReadCentralDir(); zip.ExtractFile(dir[0], csDecrypt); zip.Close(); zip.Dispose(); fsTemp.Close(); File.Delete(path + ".tmp"); msInp.Dispose(); } } } } catch (Exception e) { frmWait.End(); lastRec = null; GC.Collect(); MessageBox.Show(e.Message); return; } lastRec = null; GC.Collect(); frmWait.End(); MessageBox.Show("Файл " + name + " успешно скачан"); }