Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Не отображаются данные переданные по сети  (Прочитано 5246 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Emiliya_Emili
Интересующийся

ru
Offline Offline
Пол: Женский

« : 03-06-2016 13:50 » 

подскажите в чем проблема
передаю данные по сети успешно без ошибок, принимаются вроде тоже,
но вместо картинки получаю пустой файл или док-т, должен быть логотип а вместо этого белый экран
Код: (C#)
отправка
 else if (messege == info)
                        {                          
                            FileInfo inf = new FileInfo(strData);
                            SendData(info, inf.Name + "@" + Convert.ToString(inf.Length));

                            FileStream Stream = File.OpenRead(strData);
                            byte[] Buffer = new byte[65535];
                            int BytesRead = -1;
                            while (BytesRead != 0)
                            {
                                BytesRead = Stream.Read(Buffer, 0, 65535);
                                SendData(fail, Convert.ToBase64String(Buffer));
                            }
                            Stream.Close();                  
                        }                

прием
 else if (messege == fail)
                        {
                            //byte[] Buffer = Convert.FromBase64String(strData);
                            int b = strData.IndexOf("\0");
                            b = b - 3;
                            int df = strData.Length - 3;
                            if (b > 0) strData = strData.Substring(3, b);
                                else strData = strData.Substring(3, df);
                            if (Writing == null)
                            {
                                Writing = File.OpenWrite(Path.Combine(path1, nam));
                            }
                            byte[] Buffer = Encoding.Default.GetBytes(strData);                            
                            Writing.Write(Buffer, 0, Buffer.Length);
                            if (strData.Length < 65535) Writing.Close();
                        }              
Записан
Emiliya_Emili
Интересующийся

ru
Offline Offline
Пол: Женский

« Ответ #1 : 03-06-2016 14:30 » 

в документ вроде что-то записалось, но там непонятный набор символов и все
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 03-06-2016 17:34 » 

1. Размер принятых точно совпадает с размером переданных?
2. Почему закомментирована декодировка из Base64?
3. Передаются пакеты, но данные не всегда кратны 64К. Я не знаю что шарп делает с буфером, когда считывает данные из потока в массив. Если он только заполняет необходимые байты, то в остальных остаётся "мусор" - предыдущие данные. А размер (BytesRead) никак не участвует при конвертировании и отправлении -> SendData(fail, Convert.ToBase64String(Buffer)); Может обнулять буфер при каждой итерации?
« Последнее редактирование: 03-06-2016 17:41 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Emiliya_Emili
Интересующийся

ru
Offline Offline
Пол: Женский

« Ответ #3 : 03-06-2016 17:37 » 

Закоментирована потому что на ней ошибка
 недопустимая длина строки или массива знаков base-64.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 03-06-2016 17:42 » 

Сорри, не думал, что Вы так быстро отреагируете. См. п.3 в предыдущем сообщении.


Добавлено через 2 минуты и 11 секунд:
4. Попробуйте для начала выключить кодирование в Base64 при отправлении данных, тогда станет ясно какая часть информации принимается.
« Последнее редактирование: 03-06-2016 17:44 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Emiliya_Emili
Интересующийся

ru
Offline Offline
Пол: Женский

« Ответ #5 : 03-06-2016 18:14 » 

если я не буду кодировать в строку то не смогу передать данные
у меня всегда отправляется строка

и еще очень важно что я передаю не просто текст а картинки доки и т д
они сначала преобразуются в байты а потом эти байты отправляются клиенту

Добавлено через 17 минут и 5 секунд:
Может обнулять буфер при каждой итерации?
а как обнулить массив?

Добавлено через 7 минут и 7 секунд:
на строке выдается ошибка "Недопустимая длина строки или массива знаков Base-64."
Код: (C#)
byte[] Buffer = Convert.FromBase64String(strData);
« Последнее редактирование: 03-06-2016 18:31 от Emiliya_Emili » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 03-06-2016 19:01 » 

Про Base64 я понял. Если данные приняты с ошибкой, то понятно, что декодирование невозможно. Поэтому и предлагаю отключить кодирование при отправлении. Другими словами отправлять простой текст. Для теста просто ASCII текст размером > 64K.

Может обнулять буфер при каждой итерации?
а как обнулить массив?

Можно просто внести инициализацию буфера в цикл:
Код: (C#)
//byte[] Buffer = new byte[65535];
int BytesRead = -1;
while (BytesRead != 0)
{
    byte[] Buffer = new byte[65535];
    BytesRead = Stream.Read(Buffer, 0, 65535);
    SendData(fail, Convert.ToBase64String(Buffer));
}
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 03-06-2016 19:05 » 

и еще очень важно что я передаю не просто текст а картинки доки и т д
они сначала преобразуются в байты а потом эти байты отправляются клиенту

Улыбаюсь Те Вы действительно считаете, что картинки, доки и тд не есть набор байтов? А что же тогда? И каким образом ToBase64String помогает перевести доки, картинки и тд в байты? Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Emiliya_Emili
Интересующийся

ru
Offline Offline
Пол: Женский

« Ответ #8 : 03-06-2016 19:31 » 

и еще очень важно что я передаю не просто текст а картинки доки и т д
они сначала преобразуются в байты а потом эти байты отправляются клиенту

Улыбаюсь Те Вы действительно считаете, что картинки, доки и тд не есть набор байтов? А что же тогда? И каким образом ToBase64String помогает перевести доки, картинки и тд в байты? Ага

насколько я поняла ToBase64String переводит массив байт в строку- это работает
а вот при приеме строку получаю а преобразовать обратно в байты не получается

Добавлено через 9 минут и 26 секунд:
Джон, как мне принимать данные но при этом не терять их изначальную кодировку а то отображается не пойми что
« Последнее редактирование: 03-06-2016 19:41 от Emiliya_Emili » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 03-06-2016 19:46 » 

В вашем случае Вы можете просто переводить (форматировать) байты в строки (хотя я так и не понял, почему нужна именно строка, как ни крути, а передаются байты - строка есть ни что иное) не прибегая к помощи Base64.

Но это проблема десятая. Вначале нужно выяснить, почему данные принимаются с ошибкой? Те ли это данные? Не видя Вашего кода приёма/передачи, предлагаю определить это эмпирически. Отправьте текстовый файл (или сформируйте текстовую переменную) содержащий "0123456789" (скопированную 7 тыс раз, что даст размер > 64KB ) без всякого Base64 кодирования. Сравните полученные данные.

Добавлено через 2 минуты и 42 секунды:
Джон, как мне принимать данные но при этом не терять их изначальную кодировку

Если Ваша программа обеспечит достоверную передачу данных (пусть строки), то и с декодированием Base64 проблем не будет.

отображается не пойми что

Так это ж всё в Base64. Чего же тут удивительного? Да ещё и "паломатая" Base64.
« Последнее редактирование: 03-06-2016 19:52 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Emiliya_Emili
Интересующийся

ru
Offline Offline
Пол: Женский

« Ответ #10 : 03-06-2016 20:01 » 

Джон, вот код
    
Код: (C#)
public partial class Form1 : Form
    {
        #region
        public Form1()
        {
            InitializeComponent();
        }
     
        private TcpListener Server;
        private TcpClient remoteClient; private TcpClient localClient;
        private Thread thClient; private Thread thServer;
        List<string> ls = new List<string>();
        public static string path1;
        const string soob = "001";
        const string info = "002";
        const string fail = "003";
        #endregion

        private void btnServer_Click(object sender, EventArgs e)
        {
            Server = new TcpListener(IPAddress.Any, 6785);
            Server.Start();        
            thServer = new Thread(() =>
            {
                remoteClient = Server.AcceptTcpClient();
                SendData(soob, GetLocDir());
                byte[] buffer = new byte[2048];

                while (remoteClient.Connected)
                {
                    Array.Clear(buffer, 0, buffer.Length);
                    remoteClient.GetStream().Read(buffer, 0, buffer.Length);
                    string strData = Encoding.Default.GetString(buffer);                
                    int b = strData.IndexOf("\0");
                    b = b - 3;
                    var messege = strData.Substring(0, 3);
                    strData = strData.Substring(3, b);
                    this.Invoke((Action)(() =>
                    {
                        if (messege == soob)
                        {
                            try
                            {
                                string poddir = String.Join("/", Directory.GetDirectories(strData));
                                string file = String.Join("/", Directory.GetFiles(strData));
                                SendData(soob, poddir + "/" + file);
                            }
                            catch (Exception) { }
                        }
                        else if (messege == info)
                        {                          
                            FileInfo inf = new FileInfo(strData);
                            SendData(info, inf.Name + "@" + Convert.ToString(inf.Length));

                            FileStream Stream = File.OpenRead(strData);
                            byte[] Buffer = new byte[65535];
                            int BytesRead = -1;
                            while (BytesRead != 0)
                            {
                                BytesRead = Stream.Read(Buffer, 0, 65535);
                                SendData(fail, Convert.ToBase64String(Buffer));
                            }
                            Stream.Close();                  
                        }                      
                    }));
                }
            });
            thServer.Start();
        }

        FileStream Writing = null;
        string nam = ""; long size = 0;
        private void btnConnect_Click(object sender, EventArgs e)
        {
            localClient = new TcpClient();
            localClient.Connect("127.0.0.1", 6785);
            thClient = new Thread(() =>
            {
                byte[] buffer = new byte[65538];
                while (localClient.Connected)
                {
                    Array.Clear(buffer, 0, buffer.Length);
                    localClient.GetStream().Read(buffer, 0, 65538);
                    string strData = Encoding.Default.GetString(buffer);
                    var messege = strData.Substring(0, 3);
                    this.Invoke((Action)(() =>
                    {
                        if (messege == soob)
                        {
                            int b = strData.IndexOf("\0");
                            b = b - 3;
                            strData = strData.Substring(3, b);
                            listView1.Clear();
                            string[] tx = strData.Split('/');
                            foreach (string s in tx)
                            {
                                listView1.Items.Add(s, 1);
                                ls.Add(s);
                            }
                        }
                        else if (messege == info)
                        {
                            int b = strData.IndexOf("\0");
                            b = b - 3;
                            strData = strData.Substring(3, b);
                            string[] tx = strData.Split('@');
                            nam = tx[0];
                            size = Convert.ToInt32(tx[1]+5);
                            textBox1.Text = tx[0];
                            textBox2.Text = tx[1];
                        }
                        else if (messege == fail)
                        {
                            int b = strData.IndexOf("\0");
                            b = b - 3;
                            int df = strData.Length - 3;
                            if (b > 0) strData = strData.Substring(3, b);
                                else strData = strData.Substring(3, df);
                            if (Writing == null)
                            {
                                Writing = File.OpenWrite(Path.Combine(path1, nam));
                            }
                            byte[] Buffer = Convert.FromBase64String(strData);////
                            Writing.Write(Buffer, 0, Buffer.Length);
                            if (strData.Length < 65535) Writing.Close();
                        }                        
                    }));
                }
            });
            thClient.Start();
            SendData(soob, GetLocDir());
        }

      public void SendData(string kod, string infoToSend)
        {
            byte[] dataToSend = Encoding.Default.GetBytes(kod + infoToSend);
            if (localClient != null && localClient.Connected)
            {
                localClient.GetStream().Write(dataToSend, 0, dataToSend.Length);
            }
            else if (remoteClient != null && remoteClient.Connected)
            {
                remoteClient.GetStream().Write(dataToSend, 0, dataToSend.Length);
            }
        }
Записан
Emiliya_Emili
Интересующийся

ru
Offline Offline
Пол: Женский

« Ответ #11 : 03-06-2016 20:03 » 

Так это ж всё в Base64. Чего же тут удивительного? Да ещё и "паломатая" Base64.

не в самой строке а например в картинке, или доке
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 03-06-2016 20:11 » 

Джон, вот код

Ну... как я и сказал. Вы передаёте таки байты:

 byte[] dataToSend = Encoding.Default.GetBytes

иначе и быть не может.

Поэтому вся Ваша "возня" (сорри) с Base64 лишняя трата времени, ресурсов и тд.

Но как я уже сказал. Проблема не в этом. Если строка будет передана правильно, то и Base64 будет работать. А если она сработает, то Вы получите Ваши картинки, доки и тд.

Что с обнулением буфера? Что с передачей тестового текста?


Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Emiliya_Emili
Интересующийся

ru
Offline Offline
Пол: Женский

« Ответ #13 : 03-06-2016 20:14 » 

Что с обнулением буфера? Что с передачей тестового текста?
а как обнулять буфер?

Добавлено через 1 минуту и 13 секунд:
данные передаются верно
« Последнее редактирование: 03-06-2016 20:15 от Emiliya_Emili » Записан
Emiliya_Emili
Интересующийся

ru
Offline Offline
Пол: Женский

« Ответ #14 : 03-06-2016 20:18 » 

а может быть что ошибка из-за этих строк кода
при приеме я вырезаю первые 3 символа отвечающие за тип сообщения
          
Код: (C#)
   int df = strData.Length - 3;
             strData = strData.Substring(3, df);
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #15 : 03-06-2016 20:18 » 

Так это ж всё в Base64. Чего же тут удивительного? Да ещё и "паломатая" Base64.
не в самой строке а например в картинке, или доке

Улыбаюсь Вы представляете как выглядят картини, доки и тд? Это набор двоичных данных сгрупированных по 8-мь бит. Неважно, текст (строка, как Вы это называете), картинка, "док", музыка, видео и, даже, такие "страшные" вещи, как, например, EXE и DLL есть ничто иное как набор байт.

Если Ваша программа способна ДОСТОВЕРНО передать байты представляющие собой строку, содержащую скажем только цифры от 0 до 9, то она сможет передавать ЛЮБУЮ информацию.

С этого надо начинать.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Emiliya_Emili
Интересующийся

ru
Offline Offline
Пол: Женский

« Ответ #16 : 03-06-2016 20:24 » 

что нужно сделать чтобы заработало как надо?
и уже тем более избавиться от той ошибки "некорректная длина ..."

Добавлено через 3 минуты и 55 секунд:
может ли такое быть что я обрезаю часть символов и из-за этого длина становиться не кратной 4?
« Последнее редактирование: 03-06-2016 20:28 от Emiliya_Emili » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #17 : 03-06-2016 20:29 » 

Что с обнулением буфера? Что с передачей тестового текста?
а как обнулять буфер?

См. выше. Я написал.

данные передаются верно

А сие из чего следует? Ф-я Convert.FromBase64String с Вами не согласна.

а может быть что ошибка из-за этих строк кода
при приеме я вырезаю первые 3 символа отвечающие за тип сообщения
          
Код: (C#)
   int df = strData.Length - 3;
             strData = strData.Substring(3, df);

Если Вы добавляете эти три символа в начало строки при передаче ПОСЛЕ Base64 кодирования, то их можно смело "вырезать" ДО декодирования.

Ещё раз. Это уже всё можно было бы давно проверить за макс. 5 мин. Отправьте простой текст без Base64 и посмотрите что Вы получаете. Какая часть остаётся после "вырезания". Сразу всё станет ясно.

Добавлено через 3 минуты и 15 секунд:
что нужно сделать чтобы заработало как надо?
и уже тем более избавиться от той ошибки "некорректная длина ..."

Добавлено через 3 минуты и 55 секунд:
может ли такое быть что я обрезаю часть символов и из-за этого длина становиться не кратной 4?

Вы это серьёзно? А может лучше будем гадать на кофейной гуще? Улыбаюсь

Что нужно сделать? -> Нужно сделать всё правильно.
Избавиться от ошибки?  -> Передать данные правильно.

И почему длина должна быть кратной четырём?
« Последнее редактирование: 03-06-2016 20:36 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Emiliya_Emili
Интересующийся

ru
Offline Offline
Пол: Женский

« Ответ #18 : 03-06-2016 20:33 » 

то есть просто отправить любой текст методом SendData?

Добавлено через 7 минут и 57 секунд:
через SendData данные передаются верно
« Последнее редактирование: 03-06-2016 20:41 от Emiliya_Emili » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #19 : 03-06-2016 20:42 » 

Нет, не любой. Его же надо потом сравнить с принятыми даными. Поэтому лучше отправлять "осмысленный" текст.

Мой вариант "0123456789"
  * после получения размер файла должен быть ровно 70 000 байтов.
  * после этого можно тупо открыть файл в любом редакторе текстов и сделать замену "0123456789" на... пустую строку.
Если
  * число замен будет равно 7 тысячам, то данные были переданы правильно.
  * размер файла после замены будет равен нулю, то данные были переданы правильно.

Добавлено через 47 секунд:
Добавлено через 7 минут и 57 секунд:
через SendData данные передаются верно

Как Вы это определяете?
« Последнее редактирование: 03-06-2016 20:43 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Emiliya_Emili
Интересующийся

ru
Offline Offline
Пол: Женский

« Ответ #20 : 03-06-2016 20:47 » 

Как Вы это определяете?
я знаю что отправляется с сервера и вижу что приходит на клиент
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #21 : 03-06-2016 20:53 » 

Улыбаюсь А можно мне тоже это увидеть?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Emiliya_Emili
Интересующийся

ru
Offline Offline
Пол: Женский

« Ответ #22 : 03-06-2016 20:56 » 

Улыбаюсь А можно мне тоже это увидеть?
не поняла
у меня таким образом передаются локал.диски, папки и файлы, а также путь к файлу что пытаюсь скачать
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #23 : 03-06-2016 21:14 » 

Emiliya_Emili, сорри, Вы давно занимаетесь программированием? Это же не есть способ отладки программы, в данном случае поиск ошибки.

Каков размер данных в случае

Цитата
локал.диски, папки и файлы, а также путь к файлу

?

Неужели больше 64К?

И, если Вы, передавая какие-нить 256 байт с буфером в 64К, получаете правильно и тип информации (Ваши 001 002 003), и данные, то значит "вырезка" работает. Или?

В чём разница при передаче файлов? 2 вещи: размер (>64К) и Base64 кодирование.

Последнее можно элементарно исключить (или нет), передавая данные без него. Вы это попробовали сделать?

Если не работает без Base64, попробовали обнулить буфер перед использованием?

Если работает без Base64, значит надо сравнить полученные данные ПЕРЕД декодированием с отправлеными ПОСЛЕ кодированния.

Если и они совпадают до бита, то заменить Base64 кодировщик, а лучше всего совсем от него отказаться.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 04-06-2016 07:27 » 

Emiliya_Emili, если упрощённо, то TCP соединение можно представить как трубу с данными - удалённо наливают в один конец, а тут вытекает. Придёт всё, что наливали, но какими порциями - заранее неизвестно. Пакеты данных нужно снабжать разделителями, обёртками. На приёмном конце вычитывать данные и выцеплять разделители, проверять обёртки, вытаскивать достоверные данные. Ну и соединять принятое вместе.

В данном, очень частном и неоптимальном случае (с использованием base64) разделителем можно назначить, скажем, нулевой байт
Записан

Aether
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 06-06-2016 13:02 » 

Может я чего и сам не понимаю, поправьте, но:
Джон, вот код
Код: (C#)
...
                byte[] buffer = new byte[2048];
...
                byte[] Buffer = new byte[65535];
...            
                BytesRead = Stream.Read(Buffer, 0, 65535);
...                                
2048 = 2^11 - выделено верно,
65Кб = 2^16 = 65536, а выделено 65535.
Тем не менее, потом что-то делают с буфером, как понимаю от 0 до 65535 элемента. Как бы последнего элемента нету получается?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #26 : 07-06-2016 06:28 » 

Aether, по большому счёту размер буфера по барабану. Можно установить размер буфера хоть 12345. Это число определяет какая максимальная часть данных будет "забираться" из потока при каждой итерации. Сколько реально было скопировано в буфер, говорит возвращаемое значение BytesRead. А приближение к числам степени двойки... ну это уже некая традиция. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Aether
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 07-06-2016 08:22 » 

Да, это я понимаю. Сначала подумал, что выделенный буфер меньше запрошенного числа байт из потока на 1. Потом уже прочёл MSDN последний аргумент функции count, а не индекс, поэтому так-то всё верно, хоть и до 64Кб не дотягивает.)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines