BadCats
@BadCats

Передача большого файла по UDP — частями?

Необходимо передать сохраненную веб страницу на клиент:
Пытаюсь разбить и передать файл по-частям:
Сервер:
private static void SendFile()
        {
            // Создаем файловый поток и переводим его в байты
            Byte[] bytes = new Byte[UdpFileServer.fs.Length];
           

            Console.WriteLine("Отправка файла размером " + UdpFileServer.fs.Length + " байт");

            UdpFileServer.fs.Read(bytes, 0, bytes.Length);




            try
            {
                if (bytes.Length > 8192)
                {
                    int offset = 0;
                    int iterations = bytes.Length / 8192;
                    Byte[][] arr = new Byte[iterations][];
                    for (int i = 0; i < iterations; i++)
                    {
                        arr[i] = new Byte[8192];
                        for (int j = 0; j < 8192; j++)
                        {
                            arr[i][j] = bytes[j + offset];
                            
                        }
                        offset += 8192;
                    }

                    for (int i = 0; i < iterations; i++)
                    {
                        Byte[] data = arr[i];
                        UdpFileServer.sender.Send(data, 8192, UdpFileServer.endPoint);
                    }
                }
                //// Отправляем файл

            }
            catch (Exception eR)
            {
                Console.WriteLine(eR.ToString());
            }
            finally
            {
                // Закрываем соединение и очищаем поток
                UdpFileServer.fs.Close();
                UdpFileServer.sender.Close();
            }

            Console.WriteLine("Файл успешно отправлен.");
            Console.Read();
        }

Клиент:
public static void ReceiveFile()
        {
            try
            {
                Console.WriteLine("-----------*******Ожидайте получение файла*******-----------");
              int iterations =   (int)fileDet.FILESIZE / 8192;
                Byte[][] data = new Byte[iterations][];
                int k = 0;
                fs = new FileStream("temp." + fileDet.FILETYPE, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
                for (int i = 0; i < iterations; i++)
                {
                    data[i] = new Byte[8192];
                    data[i] = receivingUdpClient.Receive(ref RemoteIpEndPoint);
                    fs.Write(data[i], 0, data.GetLength(0));
                    //k = 8192 * i;
                }
                // Получаем файл
               

                // Преобразуем и отображаем данные
                Console.WriteLine("----Файл получен...Сохраняем...");

                // Создаем временный файл с полученным расширением
                
                

                Console.WriteLine("----Файл сохранен...");

               

             
            }
            catch (Exception eR)
            {
                Console.WriteLine(eR.ToString());
            }
            finally
            {
                fs.Close();
                receivingUdpClient.Close();
                Console.Read();
            }
        }

- в итоге, клиент - просто виснет на сообщении
Console.WriteLine("-----------*******Ожидайте получение файла*******-----------");
- exception - а - нет.
Так же, возник вопрос насчет записи в файл в цикле:
fs.Write(data[i], 0, data.GetLength(0));
                    //k = 8192 * i;

- вместо 0 - указывал смещение k, но выходил за границы массива.
P.S - К сожалению, пока что, не имею теоретических знаний по части работы сети, да и в c# - с этим никогда не работал, но срочно появилась необходимость сделать "здесь и сейчас".
  • Вопрос задан
  • 1187 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Sumor
UDP не гарантирует доставку. Пакеты могут потеряться. Пакеты могут прийти в другом порядке.
Длина файла возможно не будет кратно 8192. В RemoteIpEndPoint возможно ошибка. Брендмауэр возможно включён.
Ваше ПО должно быть к этому готово.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы