网络传送图片的问题~~
首先在服务端把从摄像头获取的图片保存为jpg形式的,然后利用文件传送的方式传到客户端,但是客户端接收到的信息总是不全,显示图片的时候只会显示前面几行的图像,后面就全都是灰色的了,其实就是文件传输问题,程序贴在下面,请各位大虾帮忙看看~~
UINT _SendFileThread(LPVOID lparam) //这个是发送视频帧的啊~~~
{
//套接字连接connect
//先发送个标识f
CFile myFile;
if(myFile.Open(pDlg->m_filename,CFile::modeRead|CFile::typeBinary)) //m_filename图片的名字
{
byte* data = new byte[60000]; //图片大小
myFile.ReadHuge(data,60000);
end=sockClient.Send((char*)data,60000);
delete data;
}
myFile.Close();
CFile::Remove(pDlg->m_filename);//删除文件
sockClient.Close();
return 0;
}
客户端接收
{
byte* data1 = new byte[60000]; //图片大小
int recvfile=recSo.Receive((char*)data1,60000);//接收图像
if(SOCKET_ERROR==recvfile)
{
MessageBox("接收图像错误");
return -1;
}
else
{
CFile destFile;
char str[10];
_itoa(num,str,10); //int和char类型转换
num++;
CString filename = str;
filename+="b.jpg";
if(destFile.Open(filename,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary))
{
destFile.WriteHuge(data1,recvfile);
}
destFile.Close();
delete data1;
//在控件上显示图片
CFile::Remove(filename);
return 0;
}
}
补充说明的就是 服务端是设置了定时器来采集图像的,setTimer(1,400,NULL)
谢谢各位了,不知道什么原因啊,tcp传输,因为还有数据要传 所以用了tcp传输~~~
[解决办法]
nt recvfile=recSo.Receive((char*)data1,60000);//接收图像
图像中黑色的部分(0x00)会被认做是'\0',所以图像信息没有取全.
楼主如果不想改代码的话,可以给图像数据加1,在接收时减去1即可
[解决办法]
lz的这段代码
:
byte* data = new byte[60000]; //图片大小
myFile.ReadHuge(data,60000);
end=sockClient.Send((char*)data,60000);
delete data;
end返回的应该是send了多少字节吧,第一次不可能一下就返回60000,
也就是说你要循环发送
这样写比较好
int nLast = 60000;
int index = 0;
while (nLast > 0)
{
int ret = sockClient.Send((char*)data + index,nLast);
nLast -= ret;
index += ret;
}
还有你一下子把一张图片读进来到一个数组中,这种做法不太好(个人觉得)
应该用一个小一点的数组分步读,分步send。
[解决办法]