Непонятные байты в сокете - 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); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д