Премини към съдържанието
  • Добре дошли!

    Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

    Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

     

darkwonderer

sslstream binary formater memorystream разминаване

Препоръчан отговор


Изпращам данни по ssl по следният начин: client->server

 public byte[] ReadBigData(SslStream sslstr, uint datalenth)
        {
            lock (this)
            {
                int _datalenth = Convert.ToInt32(datalenth);
                byte[] paket = new byte[_datalenth];
                int paketSizes = 15000;// 000;

                if (paket.Length < paketSizes)
                {
                    sslstr.Read(paket, 0, paket.Length);
                    return paket;
                }
                //bool fistRead = true;
                //int dataRead=0;
                int currentRead = 0;

                int ostatyk = _datalenth % paketSizes;
                int broiPaketi = _datalenth / paketSizes;
                if (ostatyk != 0)
                    broiPaketi++;

                byte[] subPaket;
                using (MemoryStream ms = new MemoryStream(paket))
                {
                    while (broiPaketi != 0)
                    {
                        if (sslstr.CanRead)
                        {
                            if (_datalenth > paketSizes)
                            {
                                currentRead = paketSizes;
                                //if (fistRead)
                                //{
                                //    currentRead -= 5;//tip paket i int s razmera =5 byta
                                //}
                                _datalenth -= currentRead;
                            }
                            else
                            {
                                currentRead = _datalenth % paketSizes;
                            }
                            subPaket = new byte[currentRead];
                            sslstr.Read(subPaket, 0, currentRead);
                            broiPaketi--;
                            if (broiPaketi != 0)
                            {
                                if (!sslstr.IsServer)
                                {
                                    sslstr.WriteByte((byte)201);//znachi ok
                                    sslstr.Flush();
                                }
                            }

                            ms.Write(subPaket, 0, currentRead);

                        }
                      
                    }
                  return paket;
                }
            }
            
        }
        public void WriteBigData(SslStream sslstr, byte[] data)
        {    lock(this)
            { 
            int paketSizes = 15000;// 000; 
            byte[] paket = data;
            byte[] subPaket;
            if (data.Length < paketSizes)
            {
                sslstr.Write(paket);
                return;
            }
            int _datalenth = data.Length;
          
            int currentRead = 0;
            
            int ostatyk = _datalenth % paketSizes;
            int broiPaketi = _datalenth / paketSizes;
            if (ostatyk != 0)
                broiPaketi++;
          
            using (MemoryStream ms = new MemoryStream(paket))
            {
                while (broiPaketi != 0)
                {
                    if(sslstr.CanWrite)
                    { 
                        if (_datalenth > paketSizes)
                        {
                            currentRead = paketSizes;
                            _datalenth -= currentRead;
                        }
                        else
                        {
                            currentRead = _datalenth % paketSizes;
                        }
                        subPaket = new byte[currentRead];
                        //sslstr.Read(subPaket, 0, currentRead);
                        //sslstr.WriteByte((byte)201);//znachi ok

                        ms.Read(subPaket, 0, currentRead);
                        sslstr.Write(subPaket,0, currentRead);
                        sslstr.Flush();
                        broiPaketi--;
                        if (broiPaketi != 0)
                            if (sslstr.IsServer)
                            {
                                if (sslstr.ReadByte() != 201)
                                    throw new sslException("WriteBigData != 201");

                            }

                    }
                }
            //    File.WriteAllBytes(@"f:\sendPaket.jpg", paket);

            }
            }
           
        }

WriteBigData се захранва от :

 

public static T BytesToObject<T>(this byte[] data) where T : DipPacketData
        {
       
            BinaryFormatter bf = new BinaryFormatter();

             using (MemoryStream ms = new MemoryStream(data, 0, data.Length))
            {             
  
                return  (T)bf.Deserialize(ms);
            }
       }

ReadBigData: 1-вия byte е номера на обекта за десериализиране, 2-5 е uint е дължината на данните за десериализиране. - затова има 5 bytе разлика в началото на файловете.

public static byte[] Combine(params byte[][] arrays)
        {
            byte[] rv = new byte[arrays.Sum(a => a.Length)];
            int offset = 0;
            foreach (byte[] array in arrays)
            {
                System.Buffer.BlockCopy(array, 0, rv, offset, array.Length);
                offset += array.Length;
            }
            return rv;
        }
        public static byte[] ObjectToByteArray<T>(this T obj) 
        {
            if (obj == null)
                return null;
            BinaryFormatter bf = new BinaryFormatter();
            using (MemoryStream ms = new MemoryStream())
            {
                bf.Serialize(ms, obj);
                byte[] Data = ms.ToArray();
                bf = null;
                byte[] headerByteDataLenth = BitConverter.GetBytes((uint)Data.Length);
                             //HeaderV                                              //Header Data lent    Data
                return Combine(new byte[1] { obj.GetType().GetDipPacketDataType() }, headerByteDataLenth, Data);
            }
        }

Под  15000 няма проблем. От hhd на hhd големи файлове (вместо sslstream filestream).  Възможно ли е нещо да се случва по мрежата заради изхода от BinaryFormatter-а (възможно ли е нещо да ми реже нуличките - big - little endian ...)? Както виждатe съм разкарал asyn-кове и task-ве пинизите и пак дърво-всичко се изпълнява на 1 thread.

Гърмежа е при сървъра xxx.BytesToObject() (xxx е правилният тип обект - клиента и сървъра използват 1 dll, няма разлика в кода):

client.bac са данните изпратени от клиента а server.bak - Създадени са чрез immediate window на visual studioto, 

System.Runtime.Serialization.SerializationException: Binary stream '178' does
 not contain a valid BinaryHeader. Possible causes are invalid stream or object
version change between serialization and deserialization.
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(He
aderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAp
pDomain, IMethodCallMessage methodCallMessage)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize
(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCr
ossAppDomain, IMethodCallMessage methodCallMessage)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize
(Stream serializationStream)

client.bac server.bak

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.


  • Разглеждащи това в момента   0 потребители

    Няма регистрирани потребители разглеждащи тази страница.

  • Подобни теми

    • от Monika Koleva
      ЗАДАЧИ C SHARP
      Здравейте! Имам нужда от помощ за решаване на следните задачи:
      1. Напишете функция, която приема като параметър масив от цели числа и
      връща като резултат сумата на двата най-големи елемента в масива.
      2. Напишете функция, която приема два параметъра - масив от цели числа и
      число X, и проверява дали съществуват точно два елемента от масива със
      сума X. Функцията връща true или false.

      3. Напишете функция, която приема като параметри два сортирани масива, и
      връща като резултат сортиран масив, получен от обединението на двата масива.

      4. Като задача 3, но ако има повтарящи се елементи, в изходния резултат
      да се елиминират повторенията (всяко число да се среща само веднъж).

      5. Напишете функция за изчисляване на вноски по ипотека с намаляващи
      вноски, която приема като параметри: int sum - сума на заема (главница),
      float interest - годишен лихвен процент, int monthsCount – период на
      заема (в брой месеци), int month - месец от началото на ипотеката и
      връща като резултат сумата, дължима през месец month. Допълнителни
      пояснения: всеки месец се заплаща една и съща сума по главницата, и
      лихва за съответния месец върху остатъка от главницата. Допуска се, че
      годишният лихвен процент остава постоянен за целия период на заема.

      6. Българските ЕГН-та се състоят от 10 цифри, като един (опростен) начин
      да се опише коя какво значи, е:
      Първите 2 цифри са рождената година
      Следващите 2 цифри са рождения месец
      Следващите 2 цифри са рождения ден
      Следващите 2 цифри са за рожденото място
      Следващата цифра указва пола - четна за мъж, нечетна за жена
      Последната цифра е чексума
      По зададен масив, съдържаш ЕГН-та, да се определи колко от тях са на
      мъже, зодия Стрелец.
      Благодаря!
    • от shanny
      Здравейте ! Имам нужда от малко помощ. Имам задача да напиша програма на C#, която да може да чете PGN файл ред по ред и да в случай, че намери непозволен ход, да покаже съобщение. 
        CODE public chessForm()
             {
                 InitializeComponent();
             }

             private void chessForm_Load(object sender, EventArgs e)
             {

             }

             private void button_exit_Click(object sender, EventArgs e)
             {
                 Application.Exit();
             }

             private void button_play_Click(object sender, EventArgs e)
             {
                 openFileDialog1.Filter = "Text Files|*.txt";
                 openFileDialog1.FileName = String.Empty;
                 DialogResult result = openFileDialog1.ShowDialog();
                 if (result == DialogResult.OK)
                 {
                     Stream fs = openFileDialog1.OpenFile();
                     StreamReader reader = new StreamReader(fs);
                     reader.ReadToEnd();

                     
                     reader.Close();
                 }
             }
         }

      До тук имам бутон, при чието натискане мога да отворя произволен файл. 

      Въпросът ми е как да направя списък с позволените ходове на всяка фигура /като отделни класове или?/ , така че при изчитане на файла да хвана грешен ход, ако има такъв? 

      Извинявам се, ако е глупав въпроса, но съм в процес на обучение и са ми доста неясни нещата все още
    • от minavazatoka
      Опитвам се да добавя key за изпълнението на мое .exe . На моят компютър върви нормално , но на други се пуска аваста и пищи . Не мога да разбера защо . С Windows 10 съм , ако това има изобщо значение . Другото , което не разбирам е , защо върви само с папките на проекта а .exe - то не може като е самостоятелно при рънване да си набие ключ в регистъра . Тук трябва да кажа също и че програмата не е вирус , но аваст и други "анти-вирусни" като дефаултната на Windows ловят .exe - то без причина . Ето и линията , която ползвам за добавяне на ключ:
      RegistryKey addProcess = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); addProcess.SetValue("Leslie", "\"" + Application.ExecutablePath.ToString() + "\"");  
    • от Greenlife
      Здравейте, от няколко дни започнах с изучаването на C#, като нямам опит в програмирането. В сайта, от който се обучавам стигнах до секцията if , но не мога да разбера следния пример:
      int age = 18; if (age > 14) { if(age > 18) { Console.WriteLine("Adult"); } else { Console.WriteLine("Teenager"); } } else { if (age > 0) { Console.WriteLine("Child"); } else { Console.WriteLine("Something's wrong"); } } Конзолата ми отпечатва "Teenager", но защо? В първия if след Int, age e по-голямо от 14, защо тогава не изписва "Adult"?
      Ще съм благодарен. ако ми обясните с прости думи , за да го разбера. Благодаря : )
    • от coda
      Здравейте нов съм във програмирането и имам една доста елементарна задачка
      1.Write a program that reads a string, reverses it and prints the result at the console.
      Example: "sample" -> "elpmas"  
       
      Написах това
       
       
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;

      namespace ReverseStringAplication
      {
          public class Program
          {
              static void Main()
              {
                  string str = "Simple";
                  Console.WriteLine();
                  Console.ReadLine(reverse(str));  /Тук ми дава грешлата
                
              }
              private static string reverse(string str)
              {
                  char[] charove = str.ToCharArray();
                  int j = charove.Length;
                  for(int i=0;i<charove.Length/2;i++)
                  {
                      char temporary = charove;
                      charove = charove[j];
                      charove[j] = temporary;
                      j--;
                  }
                  return new String(charove);
              }
          }

      }
       
      И ми дава тази грекшка
      Error    1    No overload for method 'ReadLine' takes 1 arguments    C:\Users\MyPc\Desktop\ForTelerik\ReverseStringAplication\ReverseStringAplication\Program.cs    15    13    ReverseStringAplication
       
       
      Ще се радвам ако някой би бил така добър да ми помогне Благодаря
       
  • Дарение

×
×
  • Добави ново...