【发布时间】:2017-08-29 07:07:26
【问题描述】:
我同时拥有 C# 应用程序和 C++ 应用程序。在 C++ 应用程序中,我将桌面屏幕捕获为 BITMAP,并通过 TCP 套接字将图像发送到 C# 应用程序。我可以通过 TCP 发送捕获的图像,但无法在 C# 应用程序中显示接收到的图像。请看代码:
在 C++ 应用程序中,用于发送图像的代码 (How can I convert BITMAPINFOHEADER into Byte array using c++):
send(theSocket, (char*)&bi, sizeof(bi), 0); send(theSocket, lpbitmap, dwBmpSize, 0);
在 C# 应用程序中:
private void startListening()
{
int port = 0;
port = Convert.ToInt32(textBox1.Text.ToString());
Console.WriteLine("Server is starting...");
byte[] data = new byte[1024];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, port);
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
newsock.Bind(ipep);
newsock.Listen(10);
label1.Invoke((MethodInvoker)delegate
{
label1.Visible = true;
label1.Text = "Waiting for a client...";
});
Socket client = newsock.Accept();
IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint;
label1.Invoke((MethodInvoker)delegate
{
label1.Text = "Connected to client. Recieving image...";
});
try
{
while (true)
{
data = ReceiveVarData(client);
using (MemoryStream ms = new MemoryStream(data))
{
bytesRead = ms.Read(data, 0, data.Length);
if (bytesRead > 0)
{
try
{
Image img = Image.FromStream(ms);
pictureBox1.Invoke((MethodInvoker)delegate
{
pictureBox1.Image = img;
pictureBox1.Refresh();
});
}
catch (ArgumentException e)
{
Console.WriteLine("something broke");
}
}
}
if (data.Length == 0)
newsock.Listen(10);
}
}
catch (Exception)
{
this.Invoke((MethodInvoker)delegate
{
this.Close();
});
}
client.Close();
newsock.Close();
}
private byte[] ReceiveVarData(Socket client)
{
int total = 0;
int recv;
byte[] datasize = new byte[4];
byte[] data=null;
try
{
recv = client.Receive(datasize, 0, 4, 0);
int size = BitConverter.ToInt32(datasize, 0);
int dataleft = size;
data = new byte[size];
while (total < size)
{
recv = client.Receive(data, total, dataleft, 0);
if (recv == 0)
{
break;
}
total += recv;
dataleft -= recv;
}
}
catch (Exception ex)
{
MessageBox.Show("Client disconnected.");
this.Invoke((MethodInvoker)delegate
{
this.Close();
});
}
return data;
}
private void button1_Click(object sender, EventArgs e)
{
var t = new Thread(startListening);
t.IsBackground = true;
t.Start();
}
【问题讨论】:
-
您是否通过调试器查看发生了什么?
-
在将接收到的数据转换为图像时,在这行代码“Image img = Image.FromStream(ms);”上出现异常'Parameter is not valid'
-
把它和你的调试器告诉你的任何其他东西/任何与问题有关的东西一起放在问题中。