Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
15 / 15 / 0
Регистрация: 30.06.2020
Сообщений: 69

Проблема при передаче файлов

21.02.2023, 21:50. Показов 1420. Ответов 11

Студворк — интернет-сервис помощи студентам
Здравствуйте, передаю строку, некоторое сообщение, затем пытаюсь передать ряд файлов с клиента на сервер. Сервер в свою очередь пишет файлы в папочку и сохраняет.

Клиент:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//само сообщение
                 stream.Write(data, 0, data.Length);
//передаём файл по одному
                 foreach (string file in fullFilePaths)
                 {
                     MessageBox.Show(file); //это для себя, что бы видеть имя файла
                     //высылка файлов
                     using (FileStream inputStream = File.OpenRead(file))
                     {
                         using (BinaryWriter writer = new BinaryWriter(stream)) // где stream - объект класса NetworkStream
                         {
                             long lenght = inputStream.Length;
                             long totalBytes = 0;
                             int readBytes = 0;
                             byte[] buffer = new byte[2048];
                             writer.Write(lenght);
                             do
                             {
                                 readBytes = inputStream.Read(buffer, 0, buffer.Length);
                                 stream.Write(buffer, 0, readBytes);
                                 totalBytes += readBytes;
                             } while (client.Connected && totalBytes < lenght);
                         }
                     }
                 }
Cервер:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
       files = fragmentsOfRequest[5];
       DBApp.AddMessage(fragmentsOfRequest[1], fragmentsOfRequest[2],fragmentsOfRequest[3], fragmentsOfRequest[4], files); 
                            
                      if (files != "0")
                      {
                          string[] allFiles = files.Split("|");
                          foreach (string file in allFiles)
                          {
                              using (BinaryReader reader = new BinaryReader(stream))
                              {
                                  long lenght = reader.ReadInt64();
                                  using (FileStream outputStream = File.Open(Path.Combine(folder, file), FileMode.Create))
                                  {
                                      long totalBytes = 0;
                                      int readBytes = 0;
                                      byte[] buffer = new byte[2048];
                                      do
                                      {
                                          readBytes = stream.Read(buffer, 0, buffer.Length);
                                          outputStream.Write(buffer, 0, readBytes);
                                          totalBytes += readBytes;
                                      } while (client.Connected && totalBytes < lenght);
                                  }
                              }
                          }
                  }
До тех самых пор, пока не добавил систему отправки файлов - чат работал превосходно.
Теперь проблема в следующем:
При пересылке нескольких файлов - первый файл загружается превосходно, а следующий стопорится (при следующей итерации). Начниает приниматься - и не завершается. Или завершается, но не корректно. В любом случае происходит разрыв соединения. Ошибка.
Да и даже если один файл загружаешь - он загружается, но происходит разрыв соединения. Какая-то ошибка, которую не могу увидеть.
При повторном запуске программы - Фото отображается, в папочке - есть. Всё работает корректно, до тех самых пор, пока заново не попробуешь отправить фотографию. И опять повтор всего, что я написал выше.
В случае загрузки нескольких фотографий или файлов - первый загрузится, второй в папке будет, но не дописан. Третий и четвёрый(если выбрать) - отсуствуют. Ошибка ВСЕГДА происходит на второй итерации. Или после первой.. Потому что и загрузив первый файл - всё равно соединение разрывается.
Прошу помогите понять где в коде ошибка.
Как написать передачу нескольких фалов корректно, что бы ошибка не возникала?

Добавлено через 4 часа 12 минут
try catch -выдаёт ошибку "Stream is not readble" на стороне сервера
а на стороне клиента "Stream is not writble".
Почему недоступен? первый же файл грузит!?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.02.2023, 21:50
Ответы с готовыми решениями:

Ошибка OutOfMemoryException при передаче больших файлов
Приветствую! Используя приложение (клиент сервер), при передаче больших файлов выходит ошибка: Выдано исключение типа...

Проблема с определением расширения файла при передаче от сервера клиенту
приложение для передачи файла от сервера клиенту. сначала передает информацию о файле, а потом сам файл. во время передачи информации о...

Одинаково ли быстродействие: 1. при передаче параметров в функцию или 2. создание кортежа и передаче его в функцию?
Одинаково ли быстродействие: 1. при передаче параметров в функцию или 2. создание кортежа и передаче его в функцию? Зависит ли это от...

11
15 / 15 / 0
Регистрация: 30.06.2020
Сообщений: 69
23.02.2023, 22:53  [ТС]
Ребята не въезжаю, помогите!
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
23.02.2023, 23:00
Manuelka, я не могу точно сказать что проблема в этом, но попробуйте
C#
10
     using (BinaryWriter writer = new BinaryWriter(stream,  Encoding.UTF8, true))
1
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
23.02.2023, 23:13
На последней итерации чтения можно прочитать больше чем нужно.
Например, размер файла 8200, вы прочитали 8192, и на следующей итерации еще 2048.
То есть прочитали оставшиеся 8 байт, а остальные 2040 (уже от следующего файла) - непонятно куда пойдут.

Добавлено через 2 минуты
Свойство Connected, говорят, бесполезно. Хоть при чтении, хоть при записи.

Добавлено через 1 минуту
Можно просто FileStream копировать в NetworkStream при отправке, так меньше кода и надежнее.

Добавлено через 2 минуты
Скорее всего, вы часть второго файла пишете в первый.
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
23.02.2023, 23:22
Manuelka, и не понял смысла создания BinaryWriter внутри цикла. Да, и вообще, зачем вы его создаёте.
Вы же просто массив байт пишите. Это можно писать напрямую в Stream.

Добавлено через 5 минут
Цитата Сообщение от IamRain Посмотреть сообщение
Можно просто FileStream копировать в NetworkStream при отправке, так меньше кода и надежнее.
Да, совершенно верно!
Я забыл что так можно сделать.
1
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
23.02.2023, 23:42
Manuelka, вам нужно более строго отслеживать границы между файлами.
Например, добавить переменую leftToRead и декрементить ее.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 using (BinaryReader reader = new BinaryReader(stream))
                              {
                                  long length = reader.ReadInt64();
                                  using (FileStream outputStream = File.Open(Path.Combine(folder, file), FileMode.Create))
                                  {
                                      long totalBytes = 0;
                                      int readBytes = 0;
                                      var leftToRead = length;
                                      var toWrite = 0;
                                      byte[] buffer = new byte[2048];
                                      do
                                      {
                                          readBytes = stream.Read(buffer, 0, buffer.Length);
                                          toWrite = Math.Min(readBytes, leftToRead);
                                          outputStream.Write(buffer, 0, toWrite);
                                          totalBytes += readBytes;
                                          leftToRead -= toWrite;
                                      } while (totalBytes < lenght);
                                  }
                              }
Добавлено через 1 минуту
И не забудьте брать в расчет байты следующего файла при следующей операции чтения.
Эту процедуру чтения файла можно вынести в отдельный метод.

Добавлено через 8 минут
Можно обобщить все это добро в виде StreamingInfo
RttStreamingInfo
И примерно так читать:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
private async ValueTask<RttStreamingInfo> ReadStreamData(Socket party, CancellationToken token, RttStreamingInfo streamingInfo)
    {
        var pSize = (int)streamingInfo.PacketSize!;
        var totalRead = streamingInfo.LeftData.Length;
        var leftToRead = pSize - totalRead;
        var toWrite = 0;
        var read = 0;
 
        var leftData = streamingInfo.LeftData;
        if (!leftData.IsEmpty)
        {
            leftData.CopyTo(streamingInfo.MessageBuffer);
            streamingInfo.LeftData = Memory<byte>.Empty;
        }
 
        while (totalRead < pSize)
        {
            read = await party.ReceiveAsync(streamingInfo.MessageBuffer[totalRead..], token);
            toWrite = Math.Min(read, leftToRead);
            leftToRead -= toWrite;
            totalRead += read;
        }
        
        streamingInfo.MessageTimetrace = Stopwatch.GetTimestamp();
 
        if (toWrite < read)
        {
            var delta = read - toWrite;
            var from = totalRead - read + toWrite;
            streamingInfo.LeftData = streamingInfo.MessageBuffer[from..(from + delta)];
        }
        
        streamingInfo.LeftData = toWrite < read ? streamingInfo.MessageBuffer[toWrite..read] : Memory<byte>.Empty;
        streamingInfo.ConstructMessage();
        return streamingInfo;
    }
Добавлено через 1 минуту
И мультибайтовые числа по сети принято передавать в BigEndian порядке.
2
15 / 15 / 0
Регистрация: 30.06.2020
Сообщений: 69
24.02.2023, 02:30  [ТС]
Интересное замечание, после того как я установил:
using (BinaryWriter writer = new BinaryWriter(stream,  Encoding.UTF8, true))
И точно ту же ситуацию совершил над BinaryReader (добавил кодировку и параметр "true"
При отправке одного файла - проблема была ликвидирована. Можно было сколько угодно раз повторить отправку, но только по одному файлу.
В случае если я пытаюсь отправить больше одного файла во второй не пишется больше вообще ничего. Файл создаётся, но он 0 байт.

И ошибка изменилась. Теперь показывает одну из двух:
1. System.ArgumentException: Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.
at System.IO.FileStream.ValidateReadWriteAr gs(Byte[] array, Int32 offset, Int32 count)
at System.IO.FileStream.Write(Byte[] array, Int32 offset, Int32 count)
at ManuelkaChatServer.ClientObject.Process( ) in C:\Users\Manuelka\source\repos\ChatServe r\ClientObject.cs:line 151

2. System.ArgumentOutOfRangeException: Non-negative number required. (Parameter 'count')
at System.IO.FileStream.ValidateReadWriteAr gs(Byte[] array, Int32 offset, Int32 count)
at System.IO.FileStream.Write(Byte[] array, Int32 offset, Int32 count)
at ManuelkaChatServer.ClientObject.Process( ) in C:\Users\Manuelka\source\repos\ChatServe r\ClientObject.cs:line 151
C#
1
totalBytes += readBytes; //151 строка
Я учёл логичное и совершенно разумное замечание о том, что нет смысла крутить в цикле открытие и закрытие BinaryWriter\Rider
И добавил изменения от IamRain.

Сейчас код выглядит так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//серверная часть
string[] allFiles = files.Split("|");
BinaryReader reader = new BinaryReader(stream);
foreach (string file in allFiles)
      {
          try
           {
               long length = reader.ReadInt64();
               using (FileStream outputStream = File.Open(Path.Combine(folder, file), FileMode.Create))
                   {
                      long totalBytes = 0;
                      int readBytes = 0;
                      var leftToRead = length;
                      var toWrite = 0;
                      byte[] buffer = new byte[2048];
                         do
                           {
                             readBytes = stream.Read(buffer, 0, buffer.Length);
                             toWrite = (int)Math.Min(readBytes, leftToRead);
                             outputStream.Write(buffer, 0, toWrite);
                             totalBytes += readBytes;
                             leftToRead -= toWrite;
                            } while (totalBytes < length);
                   }
            }catch(Exception e) { Console.WriteLine(e.ToString()); }
     }
И теперь если выбрать, например 4 файла, то 1 файл загрузится, и ещё 3 создадутся, но по 0 байт.

Клиентская часть:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
try
                {
                    BinaryWriter writer = new BinaryWriter(stream, Encoding.UTF8, true);
                    foreach (string file in fullFilePaths)
                    {
                        using (FileStream inputStream = File.OpenRead(file))
                        {
                            long lenght = inputStream.Length;
                            long totalBytes = 0;
                            int readBytes = 0;
                            byte[] buffer = new byte[2048];
                            writer.Write(lenght);
                            do
                            {
                                readBytes = inputStream.Read(buffer, 0, buffer.Length);
                                stream.Write(buffer, 0, readBytes);
                                totalBytes += readBytes;
                            } while (totalBytes < lenght);
                        }
                    }
                    writer.Dispose();
                    writer.Close();
К слову говоря, клиент вроде связь не разрывает, однако достучаться до сервера не может. По всей видимости на сервере не завершается какой-то процесс (полагаю цикл While) и по этому дальнейшие действия клиента - невозможны.

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Добавлено через 5 минут
Сообщение от IamRain
Можно просто FileStream копировать в NetworkStream при отправке, так меньше кода и надежнее.
Да, совершенно верно!
Я забыл что так можно сделать.
Вот этого я не понял, каким образом можно FileStream копировать в NetworkStream?
Я вроде так и делаю...
C#
1
2
readBytes = inputStream.Read(buffer, 0, buffer.Length);
stream.Write(buffer, 0, readBytes);
Добавлено через 7 минут
И только что заметил, только что заметил, выбрал 4 фотографии, и в этот раз он первую записал успешно, а остальные три залепил в один файл!

Добавлено через 54 секунды
однозначно что-то где-то с передачей байтов косячу.

Добавлено через 14 минут
Цитата Сообщение от IamRain Посмотреть сообщение
И не забудьте брать в расчет байты следующего файла при следующей операции чтения.
можно для нубов более подробно?(
Как это сделать грамотно? как-то обрывать цикл записи и начинать по новой?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
24.02.2023, 09:24
Цитата Сообщение от Manuelka Посмотреть сообщение
Вот этого я не понял, каким образом можно FileStream копировать в NetworkStream?
C#
7
8
9
10
11
12
13
14
15
16
17
                 foreach (string file in fullFilePaths)
                 {
                     MessageBox.Show(file); //это для себя, что бы видеть имя файла
                     //высылка файлов
                     using (Stream inputStream = File.OpenRead(file))
                     {
                         // Сначала отправка длины файла
 
                         // Потом копирование файла в выходной поток.
                         inputStream.CopyTo(stream);
                     }
Добавлено через 5 минут
Цитата Сообщение от Manuelka Посмотреть сообщение
И только что заметил, только что заметил, выбрал 4 фотографии, и в этот раз он первую записал успешно, а остальные три залепил в один файл!
Скорее всего сбои из-за неверной работы с буфером. Если использовать nputStream.CopyTo(stream), то буфер не нужен. Всё само автоматически будет верно отправляться.

Или неверно отлавливаете конец файла и длину следующего фрагмента.
Для начала отладьте получение всех файлов единым куском, чтобы информация о длине фрагментов тоже записывалась.
Длину файла конвертируйте в байты и записывайте в stream, а не в BinaryWriter.
Расчленить полученный поток на отдельные файлы - это уже вторая проблема, которая решается гораздо проще.
Главное что будет переданна вся информация.

Добавлено через 6 минут
Конвертирование long (длины файла) в массив байтов делайте методом BitConverter.(UInt64).
Обратное конвертирование одной из перегрузок метода BitConverter.ToUInt64(....).

Добавлено через 9 минут
Manuelka, и я не вижу - вы отправляете имена файлов или нет?
Думаю их тоже следует отправлять.
Стринг имена так же следует конвертировать в массивы байт, но уже методами класса Encoding. У класса есть статические свойства с кодеками по умолчанию. Используйте какой-то из них.
1
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
24.02.2023, 10:13
Цитата Сообщение от Manuelka Посмотреть сообщение
можно для нубов более подробно?(
Те лишние байты, которые приходят при записи последнего сегмента предыдущего файла, нужно в первую очередь записать в следующий файл.
Более грамотно - пример выше есть. Вы просто сохраняете оставшиеся байты в буфер LeftData, при следующем вызове метода копируете в основной буфер.
1
15 / 15 / 0
Регистрация: 30.06.2020
Сообщений: 69
05.03.2023, 14:06  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
Вы просто сохраняете оставшиеся байты в буфер LeftData, при следующем вызове метода копируете в основной буфер.
В общем я попробовал и у меня вышла лажа. Вообще фигня получилась, или я что-то не так писал.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Manuelka, и я не вижу - вы отправляете имена файлов или нет?
Да, имена файлов находятся в строке:
Цитата Сообщение от Manuelka Посмотреть сообщение
string[] allFiles = files.Split("|");
Ликвидировал BinaryReader полностью по вашему совету, вроде всё работало, пока не начал мутить воду дальше.
Попытался реализовать идею с полной загрузкой файлов в один массив байтов, а затем его разделением - потерпел не удачу, а так же непонятно было какой объём массива байтов мне нужно выделять под буфер для "всех файлов в один", для последующего разделения. Ведь неизвестно, вдруг пользователь решит грузить там 2 файла по 2 гига, это я должен предусмотреть как минимум 5 гигов, на этот буфер. А если фала 3? В общем на мой взгляд идея обречена на неудачу. Да и попытавшись её реализовать - я потерпел неудачу.
Сложная задачка оказалась хотя казалось бы - загрузить пару файлов через TCP что может быть проще?
В общем я вновь прошу помощи с реализацией данного вопроса!
На данный момент серверный код выглядит так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
byte[] buffer = new byte[2048];
byte[] leftData = new byte[2048];
string[] allFiles = files.Split("|");
//BinaryReader reader = new BinaryReader(stream, Encoding.UTF8, true);
foreach (string file in allFiles)
{
  try
    {
      var countBytesOfLengthFile = stream.Read(buffer, 0, data.Length);
      ulong length = BitConverter.ToUInt64(buffer);
      ulong totalBytes = 0;
      int readBytes = 0;
      var leftToRead = length;
      var toWrite = 0;
 
      //long length = reader.ReadInt64();
       using (FileStream outputStream = File.Open(Path.Combine(folder, file), FileMode.Create))
          {
                                                
             do
                {
                   readBytes = stream.Read(buffer, 0, buffer.Length);
                   toWrite = (int)Math.Min((ulong)readBytes, leftToRead);
                   outputStream.Write(buffer, 0, toWrite);
                   totalBytes += (ulong)readBytes;
                   leftToRead -= (ulong)toWrite;
                 } while (totalBytes < length);
 
                                                
          }
 //cохранён код, успешно загружающий 1 файл, без изменения клиентской части:                                          
//using (BinaryReader reader = new BinaryReader(stream, Encoding.UTF8, true))
//{
//    long lenght = reader.ReadInt64();
//    using (FileStream outputStream = File.Open(Path.Combine(folder, file), FileMode.Create))
 
//    {
//        long totalBytes = 0;
//        int readBytes = 0;
//        byte[] buffer = new byte[2048];
//        do
//        {
//            readBytes = stream.Read(buffer, 0, buffer.Length);
//            outputStream.Write(buffer, 0, readBytes);
//            totalBytes += readBytes;
//        } while (totalBytes < lenght);
 
//    }
//}
}
   catch(Exception e) { Console.WriteLine(e.ToString()); }
}
//reader.Dispose();
//reader.Close();
Клиентский:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 //само сообщение
                    stream.Write(data, 0, data.Length);
                    foreach (string file in fullFilePaths)
                    {
                        // высылка файлов
                        using (FileStream inputStream = File.OpenRead(file))
                        {
                            long lenght = inputStream.Length;
                            stream.Write(BitConverter.GetBytes(lenght), 0, BitConverter.GetBytes(lenght).Length);
                            inputStream.CopyTo(stream); //это решили упросить и уменьшить код.
                        }
 
                    }
Мне необходимо решить данный вопрос прежде всего для самого себя. Помогите разобраться!
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
05.03.2023, 15:54
Цитата Сообщение от Manuelka Посмотреть сообщение
На данный момент серверный код выглядит так:
Какие-то потуги видны, но чего-то не видно, что вы до конца понимаете, что там вообще должно происходить.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using (FileStream outputStream = File.Open(Path.Combine(folder, file), FileMode.Create))
          {
                                                
             do
                {
                   readBytes = stream.Read(buffer, 0, buffer.Length);
                   toWrite = (int)Math.Min((ulong)readBytes, leftToRead);
                   outputStream.Write(buffer, 0, toWrite);
                   totalBytes += (ulong)readBytes;
                   leftToRead -= (ulong)toWrite;
                 } while (totalBytes < length);
 
                                                
          }
Далее после цикла while нужно проверить, если последняя операция чтения вернула байтов больше чем нужно, то есть readBytes > toWrite, то это значит, что прилетели данные уже от следующего файла. И т.д.

Цитата Сообщение от Manuelka Посмотреть сообщение
загрузить пару файлов через TCP что может быть проще?
Вот этот репо гляньте, вдохновлено вопросом одного индуса на stackoverflow.
Как с этим работать:
1. Есть сервер Retranslator - он принимает файлы от одного или более sender-ов, и ретранслирует все эти файлы (по одному) всем подключенным Receiver-ам.
2. Sender - отправляет файлы на Retranslator (там в репо три картинки есть).
3. Receiver - просто ждет, когда Retranslator отправит файлы.

Интереса ради можете запустить в таком порядке:
1. Retranslator
2. 1 или более Receiver-ов (собрать проект и сделать несколько копий папок).
Чтобы увидеть, что действительно все Receiver-ы получают свои файлы.
3. Запустить Sender.

Единственное что осталось сделать:
- Проверить работоспособность сразу множества Sender-ов и множества Receiver-ов.
- По research-ить с целью подбора оптимальных размеров системных и прикладных буферов под различные размеры файлов (вплоть до 10GB - было бы неплохо)
- Проверить long-running работу Receiver-ов
Уже после этот репо действительно может быть полезным. Но мне пока лень к этому возвращаться, надо еще разобраться как в markdown-е chart-ы рисовать.

Добавлено через 11 минут
Прием - это всегда самое сложное в сетевом программировании.
И тут используется всего лишь один из подходов - length-prefixed approach, имхо, самый оптимальный.
Есть еще парочка других способов:
- Чуть посложнее, delimiter-based - когда заранее неизветен размер передаваемых данных/cообщений
- На основе end-of-stream-indicator - когда read() операция возвращает 0, это значит, что отправляющая сторона в текущем соединении
больше не будет оптравлять данных.
Самый простой способ. Для заранее неизвестного размера данных. Например, в transcoding или echo протоколах используется.
1
15 / 15 / 0
Регистрация: 30.06.2020
Сообщений: 69
05.03.2023, 18:30  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
Далее после цикла while нужно проверить, если последняя операция чтения вернула байтов больше чем нужно, то есть readBytes > toWrite, то это значит, что прилетели данные уже от следующего файла. И т.д.
Это делал! просто вышло криво, не сработало, и я удалил, я понял о чем вы писали, звучит логично и правильно, но вылетала ошибка памяти. Если вы настаиваете я попробую в четвёртый раз написать эту идею. Мне в любом случае нужно научиться принимать файлы. Если я научусь это делать, я смогу двинуться дальше в самообразовании, и заниматься другими идеями. Логика мне ясна, но фактически воссоздать идею не удалось. Короче попробую ещё раз, окей.

Цитата Сообщение от IamRain Посмотреть сообщение
Вот этот репо гляньте, вдохновлено вопросом одного индуса на stackoverflow.
В программе, которую я пишу есть метод BroadсastMessage. Он реализует эту идею, правда отправляет текст. Да и в общем и целом, я сделал хитрее. Я файлики гружу в папочку.. на сервере... Упоминания о файликах (md5(их имена)) пишу в БД (в отдельное поле для этого предназначенное) и когда сообщение клиенту приходит - он его получает и у него создаётся картинка с параметром Source="IPсервера\дирректория\тот самый файлик.jpg" если формат не картинки - ссылочка создаётся, а не картинка. Вот такой вот хитрый подход я придумал)

Однако идея бродкаст-пересылки файлов, если клиенты онлайн - идея прикольная, звучит аппетитно) давно думал о том, что бы лешить сервер мусора и переправлять сообщения, а так же файлики p2p(пусть моя задумка носит не более чем академический характер, однако это действительно гипотетически интересно!!!). Займусь после того, как научусь, разберусь с приёмом сообщений обязательно)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.03.2023, 18:30
Помогаю со студенческими работами здесь

Проблема с объединением сообщений при передаче по TCP
Вообщем делаю регистрацию и авторизацию клиента на сервере. Клиент: private void button1_Click(object sender, EventArgs e) { ...

Проблема с вызовом метода PagedListPager, при передаче AjaxOptions
Доброго всем. Подчеркивает AjaxOptions @Html.PagedListPager(ViewBag.OnePageOfProducts, Function(page) Url.Action(&quot;Index&quot;, New With...

Проблема с получением привязанных данных при передаче готового объекта
все привет.Помогите разобраться У меня есть главная форма. По кнопке вызывается форма 2 на которой пользователь вносит данные. ...

Проблема при "передаче" данных в гистограму
Проблема: При &quot;передаче&quot; даных в гистограму (this.chart2.Series.Points.AddXY(ch, d);)

При передаче файлов по значению
Что случится с переменными и аргументами?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru