Передача больших файлов tcp. Клиент зависает - C#
Формулировка задачи:
Здравствуйте, мне нужно было написать два приложения клиент (c#) и сервер(c++ под linux) и организовать передачу файлов между ними.
Сделал(Сервер): Пример отправки данных C++ linux.
Кусок отправки файла..
Клиент: Прием файла C#
Файлы до 100 (Примерно) передаются нормально без потерь, пытаюсь передать 518,7 мб (518*651*987 байт), но клиент зависает на разных количествах байт.
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);
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)); }
495*738*880 байт 468*386*303 байт
и т.д в диапазоне 200 - 400мб. Не переваливает за 500мб. Сначала думал что переполнение пакетов в потоке, сделал паузу на сервере через каждые 3мб, но нет проблема осталась. Пробовал изменить классы для работы с файламиFileStream
,StreamWriter
,Stream
не чего не вышло. Мне такие большие файлы надеюсь передавать не придётся, но всё же хотелось реализовать такую возможность на всякий сучий. Что скажите?Решение задачи: «Передача больших файлов tcp. Клиент зависает»
textual
Листинг программы
filesize -= bytesRead; if (filesize == 0) break;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д