C# 无法通过UDP发送图像
这将获取并发送屏幕截图:C# 无法通过UDP发送图像,c#,image,sockets,udp,send,C#,Image,Sockets,Udp,Send,这将获取并发送屏幕截图: public void SendSS() { try { while (!mainFrm.ssStop) { memStream = new MemoryStream(halfBuffer); Rectangle totalSize = Rectangle.Em
public void SendSS()
{
try
{
while (!mainFrm.ssStop)
{
memStream = new MemoryStream(halfBuffer);
Rectangle totalSize = Rectangle.Empty;
Screen s = Screen.PrimaryScreen;
totalSize = Rectangle.Union(totalSize, s.Bounds);
Bitmap screenShotBMP = new Bitmap(totalSize.Width, totalSize.Height, PixelFormat.
Format32bppArgb);
Graphics screenShotGraphics = Graphics.FromImage(screenShotBMP);
screenShotGraphics.CopyFromScreen(totalSize.X, totalSize.Y, 0, 0, totalSize.Size,
CopyPixelOperation.SourceCopy);
screenShotBMP.Save(memStream, ImageFormat.Gif);
//Send data to contact over via port.
byte[] dataToWrite = memStream.ToArray();
ssUdpClient.Send(dataToWrite, dataToWrite.Length, mainFrm.contactIP, 1500);
screenShotBMP.Dispose();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "frmVoiceChat-SendSS()", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
接收图像,然后在图片框中显示:
public void ReceiveSS()
{
try
{
IPEndPoint remoteEPSS = new IPEndPoint(IPAddress.Any, 1500);
while (!mainFrm.ssStop)
{
//Receive data.
mainFrm.receiveSSByteData = ssUdpClient.Receive(ref remoteEPSS);
//Decompress the data.
byte[] byteDecodedData = new byte[mainFrm.receiveSSByteData.Length];
byteDecodedData = mainFrm.receiveSSByteData;
MemoryStream receivedMemStream = new MemoryStream(byteDecodedData);
Image image = Image.FromStream(receivedMemStream);
pbScreenShare.Image = image;
pbScreenShare.BackgroundImage = image;
//image.Dispose();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "frmVoiceChat-ReceiveSS()", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
我遇到的问题是数据报对于缓冲区来说太大,或者缓冲区对于数据报来说太小。如何使图像的字节足够小,能够通过套接字并在最后仍然显示为完整的图像?压缩图像或使用TCP协议。UDP数据报有效负载限制在约65500字节。请重新设计系统以使用TCP。通过UDP发送大量数据是一个糟糕的主意,您的网络管理员可能会给您一个新的。如果您超过了限制,您不能简单地通过多个数据包来打破它,因为UDP不能保证传输顺序。