服务器端发送图片 private void btnListener_Click(object sender, EventArgs e)
        {
            udpSend = new UdpClient();
            // 截图
            udpSendImage.SendMessage(this.hHwnd, 0x41e, 0, 0);
            IDataObject obj1 = Clipboard.GetDataObject();
            if (obj1.GetDataPresent(typeof(Bitmap)))
            {
                // 获取视频中的图片
                Image image = (Image)obj1.GetData(typeof(Bitmap));
                imageInfo = ImageToByteArray(image);
               // int length = ImageToByteArray(image).Length;
                try
                {
                    udpSend.Send(imageInfo, imageInfo.Length, ep);
                    
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "service");
                }
        }// 将图片转换成二进制
        private byte[] ImageToByteArray(Image image)
        {
            MemoryStream ms = new MemoryStream();
            image.Save(ms,ImageFormat.Gif);
            return ms.ToArray();
        } 客户端接受图片 private void btnClient_Click(object sender, EventArgs e)
        {
            udpRecevice = new UdpClient(2000);
            try
            {
                receviceInfo = udpRecevice.Receive(ref ep);
                this.pictureBox1.Image = ByteArrayToImage(receviceInfo, receviceInfo.Length);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message,"client");
            }
        } // 将二进制转换成图片public Image ByteArrayToImage(byte[] byteArrayIn, int count)
        {
            MemoryStream ms = new MemoryStream(byteArrayIn, 0, count);
            Image returnImage = Image.FromStream(ms);
            return returnImage;
        }运行的时候报错了,错误是:一个在数据报套接字上发送的消息大于内部消息缓冲器或其他一些网络限制,或该用户接受数据报的缓冲器比数据报小 怎么解决啊,请求帮助谢谢

解决方案 »

  1.   

    服务器端 #region 字段
            private int hHwnd;  // 显示图像句柄
            private const int port = 2000;  // 端口号        private UdpClient udpSend;  // 发送数据
            private IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);        #endregion        #region 结构
            public struct videohdr_tag
            {
                public byte[] lpData;
                public int dwBufferLength;
                public int dwBytesUsed;
                public int dwTimeCaptured;
                public int dwUser;
                public int dwFlags;
                public int[] dwReserved;        }
            #endregion        #region avicap32.dll
            [DllImport("avicap32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
            public static extern int capCreateCaptureWindowA([MarshalAs(UnmanagedType.VBByRefStr)]   ref   string lpszWindowName, int dwStyle, int x, int y, int nWidth, short nHeight, int hWndParent, int nID);
            [DllImport("avicap32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
            public static extern bool capGetDriverDescriptionA(short wDriver, [MarshalAs(UnmanagedType.VBByRefStr)]   ref   string lpszName, int cbName, [MarshalAs(UnmanagedType.VBByRefStr)]   ref   string lpszVer, int cbVer);
            #endregion
            #region user32
            [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
            public static extern bool DestroyWindow(int hndw);
            [DllImport("user32", EntryPoint = "SendMessageA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
            public static extern int SendMessage(int hwnd, int wMsg, int wParam, [MarshalAs(UnmanagedType.AsAny)]   object lParam);
            [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
            public static extern int SetWindowPos(int hwnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);
            #endregion
            #region vfw32.dll
            [DllImport("vfw32.dll")]
            public static extern string capVideoStreamCallback(int hwnd, videohdr_tag videohdr_tag);
            [DllImport("vicap32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
            public static extern bool capSetCallbackOnFrame(int hwnd, string s);
            #endregion        #region Private Methods
            // 开始捕获摄像头,并将摄像的内容显示在panel中
            private void OpenCapture()
            {
                int intWidth = this.plImage.Width;
                int intHeight = this.plImage.Height;
                int intDevice = 0;
                string refDevice = intDevice.ToString();
                //创建视频窗口并得到句柄
                hHwnd = udpSendImage.capCreateCaptureWindowA(ref refDevice, 1342177280, 0, 0, 640, 480, this.plImage.Handle.ToInt32(), 0);
                if (udpSendImage.SendMessage(hHwnd, 0x40a, intDevice, 0) > 0)
                {
                    udpSendImage.SendMessage(this.hHwnd, 0x435, -1, 0);
                    udpSendImage.SendMessage(this.hHwnd, 0x434, 0x42, 0);
                    udpSendImage.SendMessage(this.hHwnd, 0x432, -1, 0);
                    udpSendImage.SetWindowPos(this.hHwnd, 1, 0, 0, intWidth, intHeight, 6);
                }
                else
                {
                    udpSendImage.DestroyWindow(this.hHwnd);
                }
            }
            // 将图片转换成二进制
            private byte[] ImageToByteArray(Image image)
            {
                MemoryStream ms = new MemoryStream();
                image.Save(ms,ImageFormat.Gif);
                return ms.ToArray();
            }
            #endregion        #region 构造函数
            public udpSendImage()
            {
                InitializeComponent();
            }
            #endregion        #region Event Methods
            // 开始
            private void btnStart_Click(object sender, EventArgs e)
            {
                this.OpenCapture();
               
                
            }
            // 停止
            private void btnStop_Click(object sender, EventArgs e)
            {
                //停止视频注销视频句柄
                udpSendImage.SendMessage(this.hHwnd, 0x40b, 0, 0);
                udpSendImage.DestroyWindow(this.hHwnd);
            }
            // 发送视频
            private void btnListener_Click(object sender, EventArgs e)
            {
                udpSend = new UdpClient();
                // 截图
                udpSendImage.SendMessage(this.hHwnd, 0x41e, 0, 0);
                IDataObject obj1 = Clipboard.GetDataObject();
                if (obj1.GetDataPresent(typeof(Bitmap)))
                {
                    // 获取视频中的图片
                    Image image = (Image)obj1.GetData(typeof(Bitmap));
                    byte[] imageInfo = ImageToByteArray(image);
                    try
                    {
                        udpSend.Send(imageInfo, imageInfo.Length, ep);
                        
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "service");
                    }
            }        private void timer1_Tick(object sender, EventArgs e)
            {
                udpSend = new UdpClient();
                // 截图
                udpSendImage.SendMessage(this.hHwnd, 0x41e, 0, 0);
                IDataObject obj1 = Clipboard.GetDataObject();
                if (obj1.GetDataPresent(typeof(Bitmap)))
                {
                    // 获取视频中的图片
                    Image image = (Image)obj1.GetData(typeof(Bitmap));
                    byte[] imageInfo = ImageToByteArray(image);
                    try
                    {
                        udpSend.Send(imageInfo, imageInfo.Length, ep);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message,"service");
                    }
                }
            }        private void udpSendImage_FormClosed(object sender, FormClosedEventArgs e)
            {
                this.udpSend.Close();
            }
            #endregion
        }客户端
     public partial class udpReceviceImage : Form
        {
            private UdpClient udpRecevice;
            private byte[] receviceInfo;  // 接受数据
            private IPEndPoint ep = new IPEndPoint(IPAddress.Any, 0);        public udpReceviceImage()
            {
                InitializeComponent();
            }        private void btnClient_Click(object sender, EventArgs e)
            {
                //byte[] a = null;
                udpRecevice = new UdpClient(2000);
                try
                {
                    receviceInfo = udpRecevice.Receive(ref ep);
                    //this.timer1.Enabled = true;
                    this.pictureBox1.Image = ByteArrayToImage(receviceInfo, receviceInfo.Length);
                    //string message = Encoding.ASCII.GetString(receviceInfo);
                   // MessageBox.Show(message,"aa");
                    //receviceInfo = udpRecevice.Receive(ref ep);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message,"client");
                }
            }
            public Image ByteArrayToImage(byte[] byteArrayIn, int count)
            {
                MemoryStream ms = new MemoryStream(byteArrayIn, 0, count);
                Image returnImage = Image.FromStream(ms);
                return returnImage;
            }        private void timer1_Tick(object sender, EventArgs e)
            {
                this.pictureBox1.Image = ByteArrayToImage(receviceInfo, receviceInfo.Length);        }        private void udpReceviceImage_FormClosed(object sender, FormClosedEventArgs e)
            {
                this.udpRecevice.Close();
            }    }
      

  2.   

    我运行不了呀,把工程放在上传到CSDN下载频道上差不多,这样粘代码很多错的
      

  3.   

    以太网上的MTU值(最大传输单元)为1500,也就是就大于这个数值的IP包一定会分多次发送,你看看你的图片数据是多大吧!
    大于这个数值长度的数据包你想一次发送一次接收是不可能的!