Асинхронный клиент: сервер подаёт 4440 байт, приходит 2048 - C#
Формулировка задачи:
Здравствуйте. Клиент - Сервер на разных компьютерах.Посылается на сервер "Начать передавайть данные" Сервер подаёт 4440байт..я получаю всего 2048 в socket.Available = 2392. в чём ошибка?
Делал всё также только вывод Асинхронный чз BeginReceive..всё тоже самое получаю 2048 байт..
всё бы ничего только это массив структур по 148байт.следовательно 2048 не делится на 148 и я не могу вывести структуру в контролл..нужно склеивать байты?как над помнить Клиенту что пакет 4400байт?
Socket s; IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse("192.168.10.100"), 6000); byte[] buf = new byte[9000]; private unsafe void GetDataBridge_Click(object sender, EventArgs e) { try { s = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); s.BeginConnect(EndPoint, new AsyncCallback(ConnectCallBack), s); } catch (Exception Ex) { MessageBox.Show(Ex.Message); } } private void ConnectCallBack(IAsyncResult ar) { try { Socket client = (Socket)ar.AsyncState; client.EndConnect(ar); //label3.Text = s.Connected.ToString(); client.Send(BitConverter.GetBytes((short)515)); byte[] l = Encoding.ASCII.GetBytes(DeviceTB.Text); byte[] k = Encoding.ASCII.GetBytes(FileNameTB.Text); byte[] p = new byte[40]; Array.Copy(l, 0, p, 0, l.Length); Array.Copy(k, 0, p, 20, k.Length); client.Send(p); //Thread.Sleep(100); //client.BeginReceive(buf, 0, buf.Length, 0, new AsyncCallback(ReceiveCallback), buf); while (true) { int read = client.Receive(buf); Invoke(new Action(() => { textBox1.AppendText(client.Available.ToString()+ " "); })); //Вывод данных в DataGridView EndReceiveByte(buf, read); } } catch (Exception e) { MessageBox.Show(e.Message, e.Source); } }
Решение задачи: «Асинхронный клиент: сервер подаёт 4440 байт, приходит 2048»
textual
Листинг программы
private void Receive(IAsyncResult ar) { Temp temp = (Temp)ar.AsyncState; Socket client = temp.socket; int count = client.EndReceive(ar); while (count < messageSize) { ////////////Вот ТУТ СИНХРОННОЕ ПОЛУЧЕНИЕ int read = client.Receive(temp.buffer, count, messageSize - count); count += read; } BeginInvoke(new Action(() => { for (int i = 0; i < read; i = i + 4) { textBox1.AppendText(String.Format(" {0}", BitConverter.ToSingle(temp.buffer, i))); } //ТУТ АСИНХРОННОЕ ПОЛУЧЕНИЕ client.BeginReceive(temp.buffer, 0, temp.buffer.Length, 0, new AsyncCallback(Receive), temp); })); //И ТУТ АСИНХРОННОЕ ПОЛУЧЕНИЕ client.BeginReceive(temp.buffer, 0, temp.buffer.Length, 0, new AsyncCallback(Receive), temp); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д