我想实现一个图像传输的功能UDP协议(客户端用VC++),服务器端用C#,客户端穿视频图像给服务器端,不是实时传输,是我在客户端发送信号后传输
因为图像的数据量比较大,一次传送不完,所以客户端要分多次发送,而服务器端也要分多次接受,这样的话,有时候传输的图像不正确,代码如下:
请指教
服务器端: private void ReceiveData()
        {//此线程用于接收客户端发送过来的数据,同时与客户端进行数据交流
            endPoint = (EndPoint)ipEndPoint;
           
            while (keepConnect)
            {
                ////接收数据并存入buff数组中
                try
                {
                 //   serverSocket.ReceiveFrom(recvBuff, ref endPoint);
                    int recvBytes = serverSocket.ReceiveFrom(recvBuff, recvBufflength, SocketFlags.None, ref endPoint);
                    //int recvBytes = serverSocket.ReceiveFrom(recvBuff, SocketFlags.None,ref endPoint);
                    //将字符数组转化为字符
                    udpEventProc(recvBuff, recvBytes);
                }
                catch (System.Exception e)
                {
                
                }
            }
        }public void ImgUdpEventProc(byte[] recvData, int recvBytes)
        {//收过来的到图像处理站发送的命令,表示已经处理完毕
                       System.Drawing.Imaging.BitmapData bmpData = bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bitmap.PixelFormat);
            IntPtr ptr = bmpData.Scan0;
            IntPtr initPtr = bmpData.Scan0;
            ptr = new IntPtr(ptr.ToInt32() + startIndex);
            try
            {
                if (ptr.ToInt32() + recvBytes - initPtr.ToInt32() > stationConst.DEFAULT_HEIGHT * stationConst.DEFAULT_WIDTH * 3)
                {
                    bitmap.UnlockBits(bmpData);
                    startIndex = 0;
                   bitmap = new Bitmap(400, 300, PixelFormat.Format24bppRgb);
                    return;
                }
                else
                {
                    System.Runtime.InteropServices.Marshal.Copy(recvData, 0, ptr, recvBytes);
                }
                
            }
            catch (System.Exception e)
            {
                bitmap.UnlockBits(bmpData);
                startIndex = 0;
                return;
            }
            startIndex = startIndex + recvBytes;
            if (startIndex+1 >= stationConst.DEFAULT_HEIGHT * stationConst.DEFAULT_WIDTH * 3)
            {
                startIndex = 0;
            }
            else
            {
               
            }
            bitmap.UnlockBits(bmpData);
        }

解决方案 »

  1.   

    是发送,确认,再发送,再确认.如果没确认到,就要重发?这个怎么搞啊?UDP协议好像没有这个吧,请指教
      

  2.   

    如果客户端的vc++的代码也是你可以修改的,就给发送的报文添加总分片数和目前发送的分片序号2个字段,并且设置从开始接受第一个分片到接收全部分片的超时时间,如果超时还没有都接收就要求对方重发缺少的分片。
    如果客户端的vc++不是你能修改的,那就没有什么好办法了。
      

  3.   

    假设第一个报文到了,这个时候报文总数字段是10,目前接收到的报文序号1,假设这10个报文应该在2分钟内全部到齐,那么开始设置变量PackTimeOut=2*60=120s,并启动一个Timer,Timer的超时时间等于PackTimeOut,当超时的时候检查是不是10个报文都到了,如果有没到的就请求重发丢失报文。
      

  4.   

    发的时候先发图像的大小信息,然后再发图像,接收到图像后与图像大小信息做对比,如果不对,要求重发,参考代码见:
    http://topic.csdn.net/u/20081004/09/fb10902a-9e42-4e41-8f38-5dc235672c74.html?1862575003