接收数据流(jpg)

flyskytoday 2010-07-16 04:04:49
//发送端
BYTE *pbyJpg=(BYTE*)GlobalLock(hMemJpg);// 这一步没问题
UINT mysize;
char *buf;
buf=new char[BUFLEN];
mysize=GlobalSize(hMemJpg);
for(int i=0;i<((WORD)mysize/BUFLEN);i++)
{
CopyMemory(buf,pbyJpg+BUFLEN*i,BUFLEN);
send(sockConn,buf,strlen(buf)+1,0);
}
if (mysize%BUFLEN!=0)
{
CopyMemory(buf,pbyJpg+BUFLEN*(mysize/BUFLEN-1),mysize%BUFLEN);
send(sockConn,buf,strlen(buf)+1,0);
}

//接收端 不能得到正确数据,不知为什么 如果正常接收完数据后用cimage 如何正确显示出来呀(从数据流中完成后读取)
char FrecvBuf[BUFLEN];
FILE *wbfp = fopen("d:\\my.jpg","wb");
memset(FrecvBuf, '\0', sizeof(FrecvBuf));
for (int mycount=0;mycount<PasteCount;mycount++)
{
length=recv(sockClient,FrecvBuf,BUFLEN,0);
fwrite(FrecvBuf,1, length,wbfp);
memset(FrecvBuf, '\0', sizeof(FrecvBuf));
}
fclose(wbfp);
...全文
179 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyskytoday 2010-07-16
  • 打赏
  • 举报
回复
已用此方法,现在在调试
图像还没有出来
image1->Draw(GetDlgItem(IDC_STATIC_PIC)->GetDC()->m_hDC,rctPicture.left,rctPicture.top,rctPicture.Width(),rctPicture.Height());
[Quote=引用 15 楼 stonewater 的回复:]
确实用文件可能更简单些,不然的话你要构建一个IStream,然后用CImage::Load(IStream* pStream)来完成
[/Quote]
stonewater 2010-07-16
  • 打赏
  • 举报
回复
确实用文件可能更简单些,不然的话你要构建一个IStream,然后用CImage::Load(IStream* pStream)来完成
cpp2017 2010-07-16
  • 打赏
  • 举报
回复
直接用内存显示是可以的,但比较麻烦还是用文件方便些.
m_tornado 2010-07-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cpp2017 的回复:]
主要问题可能是出在strlen这里,因为strlen遇到0的数据就返回长度了,但jpg里面肯定会有0的字节.
[/Quote]

确实,我原来也做过接收的图像,结果收到的图像花花绿绿的看不到一点效果,后来用异步套接字搞定的,当然读取文件也要注意~
flyskytoday 2010-07-16
  • 打赏
  • 举报
回复
膜拜~~
这几天就找源码看和调试,总算有一点点入门,起码知道gdi了
[Quote=引用 6 楼 hastings 的回复:]
mark...
[/Quote]
flyskytoday 2010-07-16
  • 打赏
  • 举报
回复
神奇了,,,按你方法一改,都正确啦~~~
我怎么没想到哩?
一个下午就搞这个 ~~

再请教一下,在接收端,如果不写文件地话,想显示在对话框上,如何直接显示呢
[Quote=引用 3 楼 stonewater 的回复:]
for(int i=0;i<((WORD)mysize/BUFLEN);i++)
{
CopyMemory(buf,pbyJpg+BUFLEN*i,BUFLEN);
send(sockConn,buf,strlen(buf)+1,0);
}
if (mysize%BUFLEN!=0)
{
CopyMemory(buf,pbyJpg+BUFLEN*(mysize/BUFLE……
[/Quote]
Eleven 2010-07-16
  • 打赏
  • 举报
回复
TransmitFile()
cpp2017 2010-07-16
  • 打赏
  • 举报
回复
我是让lz在循环中写到jpg与接收一样,这样可看出是你组包出错了还是接受数据出错了.


cpp2017 2010-07-16
  • 打赏
  • 举报
回复
主要问题可能是出在strlen这里,因为strlen遇到0的数据就返回长度了,但jpg里面肯定会有0的字节.
hastings 2010-07-16
  • 打赏
  • 举报
回复
5楼这样发送的数据很大怎么办?
hastings 2010-07-16
  • 打赏
  • 举报
回复
mark...
stonewater 2010-07-16
  • 打赏
  • 举报
回复
其实直接这样发送不就完了
send(sockConn,pbyJpg,mysize,0);

stonewater 2010-07-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cpp2017 的回复:]
你在send的时候加上写到文件去的代码, 看图片能不能显示?
[/Quote]

人家让你写文件,你要把你send函数中用的数据写文件啊,你那样写当然没问题
stonewater 2010-07-16
  • 打赏
  • 举报
回复
for(int i=0;i<((WORD)mysize/BUFLEN);i++)
{
CopyMemory(buf,pbyJpg+BUFLEN*i,BUFLEN);
send(sockConn,buf,strlen(buf)+1,0);
}
if (mysize%BUFLEN!=0)
{
CopyMemory(buf,pbyJpg+BUFLEN*(mysize/BUFLEN-1),mysize%BUFLEN);
send(sockConn,buf,strlen(buf)+1,0);
}

改为

for(int i=0;i<((WORD)mysize/BUFLEN);i++)
{
CopyMemory(buf,pbyJpg+BUFLEN*i,BUFLEN);
send(sockConn,buf,BUFLEN,0);
}
if (mysize%BUFLEN!=0)
{
CopyMemory(buf,pbyJpg+BUFLEN*(mysize/BUFLEN-1),mysize%BUFLEN);//这里不用减1吧 send(sockConn,buf,mysize%BUFLEN,0);
}
flyskytoday 2010-07-16
  • 打赏
  • 举报
回复
在send完成后
CFile mfile("d:\\jj.jpg",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
mfile.Write(pbyJpg,mysize);
mfile.Close();
文件正常
cpp2017 2010-07-16
  • 打赏
  • 举报
回复
你在send的时候加上写到文件去的代码, 看图片能不能显示?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧