Передача больших файлов 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;