Передача файлов без потерь - C#
Формулировка задачи:
Всем привет! Подскажите каким образом организовать передачу файлов по локалке без потерь(протокол TCP)?
Есть у меня код по передаче файлов, мелкие файлы (примерно до 20 мб) передаёт нормально, а вот побольше которые, идут с потерями.
Сервер:
Клиент:
protected void FileReceiver()
{
string myHost = System.Net.Dns.GetHostName();
string myIP = System.Net.Dns.GetHostByName(myHost).AddressList[0].ToString();
IPAddress localAddr = IPAddress.Parse(myIP);
TcpListener Listen = new TcpListener(localAddr, 6999);
Listen.Start();
Socket ReceiveSocket;
while (true)
{
try
{
ReceiveSocket = Listen.AcceptSocket();
Byte[ ] Receive = new Byte[ 256];
using (MemoryStream MessageR = new MemoryStream())
{
Int32 ReceivedBytes;
Int32 Firest256Bytes = 0 ;
String FilePath = "" ;
do
{
ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0 );
//Разбираем первые 256 байт
if (Firest256Bytes < 256 )
{
Firest256Bytes += ReceivedBytes;
Byte[ ] ToStr = Receive;
if (Firest256Bytes > 256 )
{
Int32 Start = Firest256Bytes - ReceivedBytes;
Int32 CountToGet = 256 - Start;
Firest256Bytes = 256 ;
ToStr = Receive.Take(CountToGet).ToArray();
Receive = Receive.Skip(CountToGet).ToArray();
MessageR.Write(Receive, 0 , ReceivedBytes);
}
FilePath += Encoding.Default.GetString(ToStr);
} else
MessageR.Write(Receive, 0 , ReceivedBytes);
} while (ReceivedBytes == Receive.Length);
String resFilePath = FilePath.Substring(0, FilePath.IndexOf("\0" ));
using (var File = new FileStream(resFilePath, FileMode.Create))
{
File.Write(MessageR.ToArray(), 0 , MessageR.ToArray().Length);
}
ChatBox.BeginInvoke(AcceptDelegate, new object[ ] { "Received: " + resFilePath, ChatBox });
}
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}private void button3_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse(IP.Text), 6999);
Socket Connector = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
Connector.Connect(EndPoint);
StringBuilder FileName = new StringBuilder(openFileDialog1.FileName);
MessageBox.Show(openFileDialog1.FileName);
int index = FileName.Length - 1;
while (FileName[index] != '\\' && FileName[index] != '/')
{
index--;
}
String resFileName = "";
for (int i = index + 1; i < FileName.Length; i++)
resFileName += FileName[i];
List<Byte> First256Bytes = Encoding.Default.GetBytes(resFileName).ToList();
Int32 Diff = 256 - First256Bytes.Count;
for (int i = 0; i < Diff; i++)
First256Bytes.Add(0);
Byte[] ReadedBytes = new Byte[256];
using (var FileStream = new FileStream(openFileDialog1.FileName, FileMode.Open))
{
using (var Reader = new BinaryReader(FileStream))
{
Int32 CurrentReadedBytesCount;
Connector.Send(First256Bytes.ToArray());
do
{
CurrentReadedBytesCount = Reader.Read(ReadedBytes, 0, ReadedBytes.Length);
Connector.Send(ReadedBytes, CurrentReadedBytesCount, SocketFlags.None);
}
while (CurrentReadedBytesCount == ReadedBytes.Length);
}
}
Connector.Close();
}
}
Люди, кто понимает подскажите как организовать это без потерь. Код переправлять не надо, я сам всё сделаю, просто дайте совет!
Решение задачи: «Передача файлов без потерь»
textual
Листинг программы
string fileName = Encoding.UTF8.GetString(first256Bytes, 0, Array.IndexOf(first256Bytes, 0));