导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

接收数据流(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);
...全文
118 点赞 收藏 16
写回复
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的时候加上写到文件去的代码, 看图片能不能显示?
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

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