Асинхронный клиент: сервер подаёт 4440 байт, приходит 2048 - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Клиент - Сервер на разных компьютерах.Посылается на сервер "Начать передавайть данные" Сервер подаёт 4440байт..я получаю всего 2048 в socket.Available = 2392. в чём ошибка?
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);
            }
        }
Делал всё также только вывод Асинхронный чз BeginReceive..всё тоже самое получаю 2048 байт.. всё бы ничего только это массив структур по 148байт.следовательно 2048 не делится на 148 и я не могу вывести структуру в контролл..нужно склеивать байты?как над помнить Клиенту что пакет 4400байт?

Решение задачи: «Асинхронный клиент: сервер подаёт 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);
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5
Похожие ответы