Непонятные байты в сокете - 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); }
}
}
}