//public string SendFileName = null; /// <summary> /// Функция для передачи данных по сети /// </summary> /// <param name="senddataparam">Структура для параметров передаваемых данных</param> public void SendData(object senddataparam) { // Состав отсылаемого универсального сообщения // 1. Заголовок о следующим объектом класса подробной информации дальнейших байтов // 2. Объект класса подробной информации о следующих байтах // 3. Байты непосредственно готовых к записи в файл или для чего-то иного. var si = new SendInfo(); var param = (SendDataParam)senddataparam; si.Message = param.Message; // Если нет сообщения и отсылаемого файла продолжать процедуру отправки нет смысла. if (string.IsNullOrEmpty(si.Message) && string.IsNullOrEmpty(param.Filename)) { return; } if (param.Filename != null) { var fi = new FileInfo(param.Filename); if (fi.Exists) { si.Filesize = (int)fi.Length; si.Filename = fi.Name; } } if (param.BufferSize > 0 && param.Rawbuffer != null) { si.BufferSize = param.BufferSize; } var paddinForCrypt = 0; if (IsCrypt && si.Filesize > 0) { //посчитаем дополнение длины файла paddinForCrypt = si.Filesize % 16; paddinForCrypt = 16 - paddinForCrypt; si.Padding = paddinForCrypt; } else { si.Padding = 0; } si.IsFileCrypt = IsCrypt; var bf = new BinaryFormatter(); var ms = new MemoryStream(); bf.Serialize(ms, si); ms.Position = 0; var infobuffer = new byte[ms.Length]; ms.Read(infobuffer, 0, infobuffer.Length); ms.Close(); var header = GetHeader(infobuffer.Length); var total = new byte[header.Length + infobuffer.Length + si.Filesize + paddinForCrypt + si.BufferSize]; Buffer.BlockCopy(header, 0, total, 0, header.Length); Buffer.BlockCopy(infobuffer, 0, total, header.Length, infobuffer.Length); // Если путь файла указан, добавим его содержимое в отправляемый массив байтов if (si.Filesize > 0) { var fs = new FileStream(param.Filename, FileMode.Open, FileAccess.Read); fs.Read(total, header.Length + infobuffer.Length, si.Filesize); fs.Close(); if (IsCrypt) { //шифруем byte[] data; var iv = new byte[16]; using (var msEncrypt = new MemoryStream()) { var cipherStream = (CryptoStream)_engine.EncryptStream(msEncrypt, DiffieHellman.SecretKey, iv); using (var plainTextStream = new MemoryStream(total, header.Length + infobuffer.Length, si.Filesize + paddinForCrypt)) { plainTextStream.WriteTo(cipherStream); } data = msEncrypt.ToArray(); } Buffer.BlockCopy(data, 0, total, header.Length + infobuffer.Length, si.Filesize + paddinForCrypt); } } if (si.BufferSize > 0) { Buffer.BlockCopy(param.Rawbuffer, 0, total, header.Length + infobuffer.Length + si.Filesize, si.BufferSize); } // Отправим данные подключенным клиентам var ns = _tcpClient.TcpClient.GetStream(); // Так как данный метод вызывается в отдельном потоке рациональней использовать синхронный метод отправки ns.Write(total, 0, total.Length); // Обнулим все ссылки на многобайтные объекты и попробуем очистить память //SendFileName = null; //Parent.labelFileName.Text = ""; GC.Collect(); GC.WaitForPendingFinalizers(); // Подтверждение успешной отправки //Parent.ShowReceiveMessage("Данные успешно отправлены!"); if (ShowStatusMessage != null) { ShowStatusMessage("Данные успешно отправлены!"); } }
public ReceiveEventArgs(SendInfo sendinfo) { _sendinfo = sendinfo; }