Передача больших файлов tcp. Клиент зависает - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, мне нужно было написать два приложения клиент (c#) и сервер(c++ под linux) и организовать передачу файлов между ними. Сделал(Сервер): Пример отправки данных C++ linux. Кусок отправки файла..
long long flsize;
    flsize = filesize / 3145728; // 16
    while(!feof(f)) //пока не конец файла, передаем частями файл (сколько помещается в буфере)
    {
      /*Берем кусок от файла 2048 байт*/
        symbols=fread(bufer,1,2048,f);
        size=ftell(f);//функция возвращает текущую позицию
        printf("read symbols: %d, part: %d, pos: %ld \n",symbols,i,size);
        printf("\n");
        send(id,bufer,symbols,0);//передача содержимого буфера
        i++;
        filesize -= 2048;
      /*Делаем паузу через каждые 3 мб*/
        if(filesize > 3145728)
        {
           if((filesize / 3145728) < flsize)
           {
             flsize -= 1;
             sleep(1);
           }
         }
    }
     std::cout << "Передал\n";
     sleep(10000);
Клиент: Прием файла C#
using (FileStream fsRecieve = File.Open(FileName, FileMode.OpenOrCreate))
                {
                    Buffer = new byte[2048]; 
                    do
                    {
                        fsRecieve.Write(Buffer, 0, bytesRead);
                        filesize -= bytesRead;
                        if (filesize == 0) break;
                    }
                    while (((bytesRead = TcpStream.Read(Buffer, 0, Buffer.Length)) > 0));
                }
Файлы до 100 (Примерно) передаются нормально без потерь, пытаюсь передать 518,7 мб (518*651*987 байт), но клиент зависает на разных количествах байт.

495*738*880 байт 468*386*303 байт

и т.д в диапазоне 200 - 400мб. Не переваливает за 500мб. Сначала думал что переполнение пакетов в потоке, сделал паузу на сервере через каждые 3мб, но нет проблема осталась. Пробовал изменить классы для работы с файлами

FileStream

,

StreamWriter

,

Stream

не чего не вышло. Мне такие большие файлы надеюсь передавать не придётся, но всё же хотелось реализовать такую возможность на всякий сучий. Что скажите?

Решение задачи: «Передача больших файлов tcp. Клиент зависает»

textual
Листинг программы
filesize -= bytesRead;
 if (filesize == 0) break;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.167 из 5
Похожие ответы