клиентская программа c # server доставляет неверные данные - PullRequest
0 голосов
/ 30 апреля 2019

когда я доставляю большие файлы с ошибочно доставленными данными, я не могу понять почему. вот код:

код сервера:

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');
...