There is a project for transferring files over the network. The file is transmitted, but transmitted only in the size of 256 bytes, and then the transfer does not progress. Please tell me the reason.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Net.Sockets; using System.Net; using System.Threading; //using System.Data.SqlClient; using System.Net.NetworkInformation; using System.Runtime.InteropServices; using System.Windows; namespace Peredacha { public partial class Form1 : Form { String IP; int combo; public Form1() { InitializeComponent(); //Создаем поток для приема сообщений new Thread(new ThreadStart(Receiver)).Start(); new Thread(new ThreadStart(FileReceiver)).Start(); } //Метод потока protected void Receiver() { //Создаем Listener на порт "по умолчанию" TcpListener Listen = new TcpListener(7000); //Начинаем прослушку Listen.Start(); //и заведем заранее сокет Socket ReceiveSocket; while (true) { try { //Пришло сообщение ReceiveSocket = Listen.AcceptSocket(); Byte[] Receive = new Byte[256]; //Читать сообщение будем в поток using (MemoryStream MessageR = new MemoryStream()) { //Количество считанных байт Int32 ReceivedBytes; do {//Собственно читаем ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0); //и записываем в поток MessageR.Write(Receive, 0, ReceivedBytes); //Читаем до тех пор, пока в очереди не останется данных } while (ReceiveSocket.Available > 0); //Добавляем изменения в ChatBox ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Получаю: " + Encoding.Default.GetString(MessageR.ToArray()), ChatBox }); } } catch (System.Exception ex) { MessageBox.Show(ex.Message); } } } //Метод потока protected void FileReceiver() { //Создаем Listener на порт "по умолчанию" TcpListener Listen = new TcpListener(6999); //Начинаем прослушку Listen.Start(); //и заведем заранее сокет Socket ReceiveSocket; while (true) { try { string name; //Пришло сообщение 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; //В случае если было принято >256 байт (двумя сообщениями к примеру) //Остаток (до 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[] { "Получено: " + resFilePath, ChatBox }); name = resFilePath; } /* DataRow workRow = bD1DataSet.Tables[0].NewRow();//BD1DataSet1.Tables[0].NewRow(); workRow["id"] = 1; workRow["data"] = System.DateTime.Now.ToLongDateString(); workRow["time"] = System.DateTime.Now.ToLongTimeString(); workRow["nazv"] = name; bD1DataSet.Tables[0].Rows.Add(workRow); this.Validate(); this.ipadressBindingSource.EndEdit(); this.tableAdapterManager1.UpdateAll(this.bD1DataSet);*/ } catch (System.Exception ex) { MessageBox.Show(ex.Message); } } } /// <summary> /// Отправляет сообщение в потоке на IP, заданный в контроле IP /// </summary> /// <param name="Message">Передаваемое сообщение</param> void ThreadSend(object Message) { try { //Проверяем входной объект на соответствие строке String MessageText = ""; if (Message is String) { MessageText = Message as String; } else throw new Exception("На вход необходимо подавать строку"); Byte[] SendBytes = Encoding.Default.GetBytes(MessageText); //Создаем сокет, коннектимся IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse(IP), 7000); Socket Connector = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); Connector.Connect(EndPoint); Connector.Send(SendBytes); Connector.Close(); //Изменяем поле сообщений (уведомляем, что отправили сообщение) ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Отправлено " + MessageText, ChatBox }); } catch (Exception ex) { MessageBox.Show(ex.Message); } } //Делегат доступа к контролам формы delegate void SendMsg(String Text, RichTextBox Rtb); SendMsg AcceptDelegate = (String Text, RichTextBox Rtb) => { Rtb.Text += Text + "\n"; }; private void button1_Click(object sender, EventArgs e) { IP = comboBox1.Text; Ping ping = new Ping(); PingReply reply = ping.Send(IP); if (reply.Status != IPStatus.Success) { MessageBox.Show("Не удаётся подключиться!"); button2.Enabled = false; } else { button2.Enabled = true; //Отправляем файл //Добавим на форму OpenFileDialog и вызовем его if (openFileDialog1.ShowDialog() == DialogResult.OK) { //Коннектимся IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse(IP), 6999); Socket Connector = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); Connector.Connect(EndPoint); //Получаем имя из полного пути к файлу StringBuilder FileName = new StringBuilder(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); //Начинаем отправку данных System.IO.FileInfo file = new System.IO.FileInfo(openFileDialog1.FileName); long size = file.Length; 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(); } } } private void button2_Click(object sender, EventArgs e) { // переместить на клавишу отправки связать с progressBar // System.IO.FileInfo file = new System.IO.FileInfo(openFileDialog1.FileName); // long size = file.Length; // MessageBox.Show(size.ToString()); // для проверки вывода размера файла new Thread(new ParameterizedThreadStart(ThreadSend)).Start("Получение"); //otpravka } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { Environment.Exit(0); } private void Form1_Load(object sender, EventArgs e) { // TODO: данная строка кода позволяет загрузить данные в таблицу "bD1DataSet.dannie". При необходимости она может быть перемещена или удалена. this.dannieTableAdapter.Fill(this.bD1DataSet.dannie); // TODO: данная строка кода позволяет загрузить данные в таблицу "bD1DataSet.ip_adress". При необходимости она может быть перемещена или удалена. this.ip_adressTableAdapter.Fill(this.bD1DataSet.ip_adress); } private void button3_Click(object sender, EventArgs e) { panel2.Visible = false; } private void button4_Click(object sender, EventArgs e) { String stro; combo = comboBox1.Items.Count; combo = combo + 1; stro = IP1.Text + "." + IP2.Text + "." + IP3.Text + "." + IP4.Text; bD1DataSet.Tables[1].Rows.Add(combo, textBox1.Text, stro); this.Validate(); this.ipadressBindingSource.EndEdit(); this.tableAdapterManager1.UpdateAll(this.bD1DataSet); panel2.Visible = false; panel1.Visible = true; } private void добавитьКомпьютерToolStripMenuItem_Click(object sender, EventArgs e) { panel1.Visible = false; panel2.Visible = true; panel3.Visible = false; } private void посмотретьВсеКомпьютерыToolStripMenuItem_Click(object sender, EventArgs e) { // Form2 f = new Form2(); //f.Show(); panel3.Visible = true; panel1.Visible = false; panel2.Visible = false; dannieDataGridView.Visible = false; ip_adressDataGridView.Visible = true; bindingNavigator1.Visible = true; bindingNavigator2.Visible = false; } private void button3_Click_1(object sender, EventArgs e) { panel2.Visible = false; IP1.Text = ""; IP2.Text = ""; IP3.Text = ""; IP4.Text = ""; textBox1.Text = ""; } private void IP1_TextChanged(object sender, EventArgs e) { String a; int f; a = IP1.Text; try { f = int.Parse(a); for (int i = 0; i <= 10; i++) { if (f == i) { a = i.ToString(); } } } catch { if (IP1.Text != "") { MessageBox.Show("Не верный символ!"); IP1.Text = ""; } } } private void IP2_TextChanged(object sender, EventArgs e) { String a; int f; a = IP2.Text; try { f = int.Parse(a); for (int i = 0; i <= 10; i++) { if (f == i) { a = i.ToString(); } } } catch { if (IP2.Text != "") { MessageBox.Show("Не верный символ!"); IP2.Text = ""; } } } private void IP3_TextChanged(object sender, EventArgs e) { String a; int f; a = IP3.Text; try { f = int.Parse(a); for (int i = 0; i <= 10; i++) { if (f == i) { a = i.ToString(); } } } catch { if (IP3.Text != "") { MessageBox.Show("Не верный символ!"); IP3.Text = ""; } } } private void IP4_TextChanged(object sender, EventArgs e) { String a; int f; a = IP4.Text; try { f = int.Parse(a); for (int i = 0; i <= 10; i++) { if (f == i) { a = i.ToString(); } } } catch { if (IP4.Text != "") { MessageBox.Show("Не верный символ!"); IP4.Text = ""; } } } private void button5_Click(object sender, EventArgs e) { } private void button6_Click(object sender, EventArgs e) { panel3.Visible = false; panel2.Visible = false; panel1.Visible = true; } private void посмотретьФайлыToolStripMenuItem_Click(object sender, EventArgs e) { panel3.Visible = true; panel1.Visible = false; panel2.Visible = false; dannieDataGridView.Visible = true; ip_adressDataGridView.Visible = false; bindingNavigator1.Visible = false; bindingNavigator2.Visible = true; } private void bindingNavigator1_RefreshItems(object sender, EventArgs e) { } private void panel3_Paint(object sender, PaintEventArgs e) { } private void progressBar1_Click(object sender, EventArgs e) { } private void button6_Click_1(object sender, EventArgs e) { panel3.Visible = false; panel2.Visible = false; panel1.Visible = true; } private void comboBox1_KeyPress(object sender, KeyPressEventArgs e) { } } }