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;
[c#] Проблема с передачей файлов
У меня в программе на асинхронных сокетах, одна из функций-это передача файлов. Клиент отсылает файл, сервер принимает и сохраняет его у себя на компьютере.
Вот выдержки кода связанного с передачей:
серверная часть:
Код:
клиент:
Код:
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(); // Закрываем файл
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(); // Закрываем файл
Проблема в том, что при условии когда сервер и клиент запущенны на одной машине, все работает отлично, но при разделении (серверная часть на одном а клиентская на другом компьютере), файл увеличивается и естественно искажается.
В чем я не прав?
В чем причина? Это может происходить по причине того, что по завершению передачи файла, клиент начинает отсылать другие сообщения? Если да, то как это исправить?