我想实现一个图像传输的功能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);
}
因为图像的数据量比较大,一次传送不完,所以客户端要分多次发送,而服务器端也要分多次接受,这样的话,有时候传输的图像不正确,代码如下:
请指教
服务器端: 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);
}
如果客户端的vc++不是你能修改的,那就没有什么好办法了。
http://topic.csdn.net/u/20081004/09/fb10902a-9e42-4e41-8f38-5dc235672c74.html?1862575003