Непонятные байты в сокете - C#

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

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

Здравствуйте! Пишу приложение, чтоб можно было управлять настольным компьютером с ноутбука по LAN'у. Но что-то не пойму в чем проблема. Постоянно вылетает исключение, т.к. по сокету приходят какие-то лишние 8192байта. Подскажите, в чем проблема? Код передачи изображения:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
 
namespace DesktopComputer
{
    static class Program
    {
        public static Socket s_ = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        private static bool isEnd = false;
 
        [STAThread]
        static void Main()
        {
            s_.Bind(new IPEndPoint(IPAddress.Any, 25684));
            s_.Listen(1000);
            for (; ; )
            {
                Socket s = s_.Accept();
                isEnd = false;
                while (!isEnd)
                {
                    try
                    {
                        byte[] data;
                        byte[] len;
                        Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
                        Graphics g = Graphics.FromImage(bmp);
                        g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(bmp.Width, bmp.Height));
                        g.Save();
                        g.Dispose();
                        MemoryStream ms = new MemoryStream();
                        Image img = bmp;
                        img.Save(ms, ImageFormat.Jpeg);
                        data = ms.ToArray();
                        len = BitConverter.GetBytes(data.Length);
                        s.Send(len);
                        s.Send(data);
                        bmp.Dispose();
                        Thread.Sleep(100);
                    }
                    catch { isEnd = true; }
                }
            }
        }
    }
}
Код приема:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
 
namespace Notebook
{
    public partial class Scrn : Form
    {
        private Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        private Thread t = null;
        private Bitmap bmp = null;
        private string sLock = "";
 
        public Scrn()
        {
            InitializeComponent();
        }
 
        private void toolStripMenuItem2_Click(object sender, EventArgs e)
        {
            this.pictureBoxScreen.SizeMode = PictureBoxSizeMode.Normal;
        }
 
        private void уместитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.pictureBoxScreen.SizeMode = PictureBoxSizeMode.Zoom;
        }
 
        private void Scrn_Load(object sender, EventArgs e)
        {
            t = new Thread(GetBMP);
            t.IsBackground = true;
            ip_ = new IPAddress(new byte[] { 10, 4, 11, 1 });
            s.Connect(new IPEndPoint(ip_, 25684));
            t.Start();
            timer1.Start();
        }
 
        private void GetBMP()
        {
            for (; ; )
            {
                byte[] len = new byte[4];
                s.Receive(len);
                byte[] data = new byte[BitConverter.ToInt32(len, 0)]; // (2)И, естественно, на второй итерации тут выбрасывается исключение, т.к. берет 4 первых "неправильных" байта
                s.Receive(data); // (1)После этого на первой итерации в буфере остается еще 8192 лишних байта непонятно откуда
                using (MemoryStream ms = new MemoryStream(data))
                {
                    ms.Position = 0;
                    lock (sLock)
                    { bmp = new Bitmap(ms); }
                }
            }
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (bmp != null)
            {
                lock (sLock)
                { this.pictureBoxScreen.Image = (Bitmap)bmp.Clone(); }
            }
        }
    }
}

Решение задачи: «Непонятные байты в сокете»

textual
Листинг программы
        private void GetBMP()
        {
            for (; ; )
            {
                byte[] len = new byte[4];
                s.Receive(len);
                int iLen = BitConverter.ToInt32(len, 0);
                int inBts = 0;
                byte[] data = new byte[iLen];
                for (int i = 0; i < iLen; i += 1024)
                {
                    if ((iLen - inBts) >= 1024)
                    {
                        s.Receive(data, inBts, 1024, SocketFlags.None);
                        inBts += 1024;
                    }
                    else
                    {
                        s.Receive(data, inBts, iLen - inBts, SocketFlags.None);
                    }
                }
                using (MemoryStream ms = new MemoryStream(data))
                {
                    ms.Position = 0;
                    lock (sLock)
                    { bmp = new Bitmap(ms); }
                }
            }
        }

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


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

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

15   голосов , оценка 4.333 из 5