Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[c#] Проблема с передачей файлов

18K
13 февраля 2012 года
imAlex
179 / / 29.07.2010
Доброго времени.
У меня в программе на асинхронных сокетах, одна из функций-это передача файлов. Клиент отсылает файл, сервер принимает и сохраняет его у себя на компьютере.
Вот выдержки кода связанного с передачей:
серверная часть:
Код:
case 2: // Принимаем название файла и создаем
                    connection.mes = Encoding.GetEncoding("windows-1251").GetString(connection.Buffer, 0, connection.bufferSize); // Декодируем имя
                    connection.FileName = new FileStream(tempFileDir + connection.mes, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); // Создаем файл
                    connection.FlagTipe = 3; // Выставляем флаг для переключения с создания файла на его запись
                    connection.mes = null;
                    connection.bufferSize = BytesOfFilePart; // Объявляем размер буфера
                    connection.Buffer = new byte[connection.bufferSize]; // Готовим буфер для приема файла частями по 1024

                     connection.Socket.BeginReceive(connection.Buffer, 0,
                                     connection.Buffer.Length, SocketFlags.None,
                                     new AsyncCallback(ReceiveCallback),
                                     connection); // Ждем следующего сообщения
                    break;
case 3:// Записываем файл
                    connection.mes = Encoding.GetEncoding("windows-1251").GetString(connection.Buffer, 0, connection.bufferSize); // декодим для дальнейфей проверки на конец файла
                    if (connection.mes.IndexOf("<END>") == -1)//Проверяем на конец файла
                    {
                        connection.FileName.Write(connection.Buffer, 0, connection.bufferSize); // Записываем полученное
                    }
                    else
                    {
                         if (connection.bytesRead > 5)// если помимо конца файла содержит фрагмент
                         {
                                connection.bytesRead -= 5; //Вычитаем последние 5 байт для
                                connection.FileName.Write(connection.Buffer, 0, connection.bytesRead); // Дописываем
                         }
                   connection.FileName.Close(); //Закрываем файл
                   connection.FlagTipe = 0; Меняем флаг, чтоб не возвращаться сюда
                  }                                  
                  connection.Socket.BeginReceive( connection.Buffer, 0,
                                 connection.Buffer.Length, SocketFlags.None,
                                 new AsyncCallback(ReceiveCallback),
                                 connection);// Ждем следующего сообщения
break;

клиент:
Код:
FileStream fstFile = new FileStream(F_Name, FileMode.Open, FileAccess.Read); // Открываем файл для чтения
    BinaryReader binFile = new BinaryReader(fstFile);// Читать будем побитово
    FileInfo fInfo = new FileInfo(F_Name);// Достаем инфу
    string FileName = fInfo.Name;// Имя файла
    new RequestServer().QueryServer(1, 2, dirServer + FileName);// Передаем серверной части имя и адрес для размещения на сервере
    long FileSize = fInfo.Length;// Узнаем размер файла
               
    int bytesSize = 0;
    byte[] downBuffer = new byte[1024]; // Создаем буфер для чтения

    while ((bytesSize = fstFile.Read(downBuffer, 0, downBuffer.Length)) > 0)// Читаем файл по 1024 байта пока прочитанное > 0
     {
         SaverSender.Sender.Send(downBuffer, 0, bytesSize, SocketFlags.None); // Отправляем прочитанное
      }
      new RequestServer().QueryServer(0, 3, endMes); // Отправляем сообщение о конце файла
      fstFile.Close(); // Закрываем файл

Проблема в том, что при условии когда сервер и клиент запущенны на одной машине, все работает отлично, но при разделении (серверная часть на одном а клиентская на другом компьютере), файл увеличивается и естественно искажается.
В чем я не прав?
18K
13 февраля 2012 года
imAlex
179 / / 29.07.2010
попробовал в консоль выводить инфу о полученном (номер пакета и его размер). Передает правильно. Файл цел.
В чем причина? Это может происходить по причине того, что по завершению передачи файла, клиент начинает отсылать другие сообщения? Если да, то как это исправить?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог