когда я доставляю большие файлы с ошибочно доставленными данными, я не могу понять почему.
вот код:
код сервера:
ASCIIEncoding asen = new ASCIIEncoding();
string data = "S5" + size.ToString();
byte[] ba_data = asen.GetBytes(data);
s.Send(ba_data);
int times = (int)Math.Ceiling(size / 1024.0); // how many loops
for (int i = 0; i < times; i++)
{
if (content.Length - 1024 * i > 1024)
{
byte[] data1024 = new byte[1024];
Array.ConstrainedCopy(content, 1024 * i, data1024, 0, 1024);
s.Send(data1024);
}
else // last iteration
{
byte[] data1024 = new byte[content.Length % 1025];
Array.ConstrainedCopy(content, 1024 * i, data1024, 0, content.Length % 1025);
s.Send(data1024);
}
}
и код клиента:
Stream stm = tcpclnt_induvidual.GetStream();
ASCIIEncoding asen = new ASCIIEncoding();
byte[] ba = asen.GetBytes("S5" + username + "#" + cbFiles.Text);
stm.Write(ba, 0, ba.Length); // send file's name
byte[] bb1 = new byte[1000];
try { int k = stm.Read(bb1, 0, 1000); } // get size
catch (Exception e1) { System.Windows.Forms.MessageBox.Show(e1.Message); }
string data = System.Text.Encoding.Default.GetString(bb1);
data = data.TrimEnd('\0');
Console.WriteLine(data);
int size = int.Parse(data.Substring(2, data.Length - 2));
int times = (int)Math.Ceiling(size / 1024.0); // how many loops
byte[] content = new byte[size];
for (int i = 0; i < times; i++)
{
if (i != times - 1)
{
try { int k = stm.Read(content, i * 1024, 1024); }
catch (Exception e1) { System.Windows.Forms.MessageBox.Show(e1.Message); }
}
else // lasp iteration
{
try { int k = stm.Read(content, i * 1024, size - (i * 1024)); }
catch (Exception e1) { System.Windows.Forms.MessageBox.Show(e1.Message); }
}
}
try
{
if (File.Exists(cbFiles.Text)) // if exist file -> "update"
{
File.Delete(cbFiles.Text);
}
if (cbFiles.Text.Contains(':'))
cbFiles.Text = cbFiles.Text.Substring(cbFiles.Text.IndexOf(':')+1);
using (FileStream fs = File.Create(cbFiles.Text)) // create file
{
fs.Write(content, 0, content.Length);
}
Array.Clear(bb1, 0, bb1.Length); // clean buffer for emrgency
try { int k = stm.Read(bb1, 0, 1000); } // recive updated list of files and status
catch (Exception e1) { System.Windows.Forms.MessageBox.Show(e1.Message); }
data = System.Text.Encoding.Default.GetString(bb1).TrimEnd('\0');