Сокеты: Ошибка при передаче данных от клиента к серверу - C#

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

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

Помогите, пожалуйста, уже месяц мучаюсь с этим клиент-сервером! Возникает ошибка в многопоточном серверном приложении - клиент принимает данные быстрее, чем их отправляет сервер. Не понимаю, как такое может быть, и откуда он их берет. Передача между клиентом-сервером организована через посредников. Клиент запрашивает у сервера список файла и выбирает файл. Сервер отправляет своему посреднику имя файла, который выбрал клиент (до этого все нормально работает), посредник клиента соединяется с посредником сервера, начинается передача данных между посредниками. При этом посредник клиента успевает передать самому клиенту сколько частей файла он получил (чтобы заполнить progress bar клиента). Передавать файл по 5Мбайт. Вот такое задание дали( Организовано все через синхронные сокеты TCP, многопоточность - обычные нити (в асинхронных сокетах совсем не разбираюсь). Служебная информация между посредниками передается прекрасно (имя файла, количество частей). Также нормально передаются маленькие файлы. Но с большими беда - сервер передает, например, 5 Мбайт (1 часть), а клиент откуда-то уже взял 50 Мбайт мусора! В результате файл приходит битый и выползает исключение. Ладно бы так все время было - раз в десять раз файл может дойти совершенно неповрежденным. Уже и время сна нити увеличивал (на стороне посредника сервера - вдруг посредник клиента не успевает принимать данные), на один раз может помочь, потом запрашивает все большее время сна. Ставил и задержку на стороне посредника, то же самое. Отключал пересылку данных клиенту (одна строчка кода посредника клиента получала данные от посредника сервера, другая посылала просто число клиенту, чтобы тот в прогресс бар отобразил). В общем, ничего не помогает. Облазил весь Интернет, тоже не нашел ничего - либо выходят ошибки, что клиенты не получают данные вообще, либо что не успевают, а у меня - зараза - наоборот слишком быстро откуда-то принимает. Может кто-нибудь знает в чем дело? Помогите!

Решение задачи: «Сокеты: Ошибка при передаче данных от клиента к серверу»

textual
Листинг программы
           while (count < col_part - 1)
            {
                buffer = new byte[size];
                fp.Receive(buffer, buffer.Length, 0);//получает от посредника часть
                string cmd = Encoding.UTF8.GetString(buffer);
                cmd = cmd.Replace("?", ""); // <---
                if (cmd != string.Empty)
                {
                    using (FileStream fs = new FileStream(path_file, FileMode.Append, FileAccess.Write))
                    {
                        fs.Write(buffer, 0, buffer.Length);
                        fs.Dispose();
                        fs.Close();
                    }
                    count++;
                    Console.WriteLine(count);
                    fс.Send(buffer_pc);//отправляет клиенту сведения о количестве переданных частей
                }
            }

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


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

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

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