예제 #1
0
        //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("Данные успешно отправлены!");
            }
        }
예제 #2
0
 public ReceiveEventArgs(SendInfo sendinfo)
 {
     _sendinfo = sendinfo;
 }