标题:MFC中图片传输接收问题
只看楼主
qwe885167759
Rank: 4
等 级:业余侠客
威 望:5
帖 子:148
专家分:259
注 册:2013-3-12
结帖率:72.22%
已结贴  问题点数:20 回复次数:6 
MFC中图片传输接收问题
void CTransfer_clientDlg::OnSendfile()
{
    // TODO: Add your control notification handler code here

    //文件打开对话框
    CFileDialog send_dlg(TRUE);
    if( IDOK == send_dlg.DoModal() )
    {
        //获取文件路径
        CString path_name = send_dlg.GetPathName();

        //创建CFile
        CFile file_context(path_name,CFile::modeRead);
        
        char context[256] = "";

        long n =0;
        long i =0;
        //读取文件内容
        while( n=file_context.Read(context,sizeof(context)) )
        {   
            i=i+n;

            //发送文件内容
            if( SOCKET_ERROR == send(socket_client,context,sizeof(context),0) )
            {
                MessageBox("文件内容发送失败");
                return;
            
            }   

                memset(context,0,sizeof(context));
        }

        CString str ;
        str.Format("%d",n);
        MessageBox(str);
        //文件关闭
        file_context.Close();
        MessageBox("文件发送完毕");
    }
}

void CTransfer_clientDlg::OnRecvfile()
{
    // TODO: Add your control notification handler code here

    //指定文件保存路径
    CFileDialog recv_dlg(false);
    if(IDOK == recv_dlg.DoModal())
    {
        CString file_path =    recv_dlg.GetPathName();

        //在指定文件路径出创建文件
        CFile file_recv(file_path,CFile::modeCreate | CFile::modeWrite);
        
        //接收文件内容
        if(socket_client)
        {
            int n =0;
            char recv_context[256] = "";
            while(recv(socket_client,recv_context,sizeof(recv_context),0))
            {
                //填写内容
               
                file_recv.Write(recv_context,n);
                if(strlen(recv_context) < sizeof(recv_context))
                    break;
                    
            }
        }
        //文件关闭
        file_recv.Close();
        MessageBox("文本保存完毕");
    }
}

发送接收是内容大小出现错误总是有重复内容出现,图片也传不过去,大家看看什么问题,有相关代码的话给发一下,邮箱2976242910@,谢谢了
搜索更多相关主题的帖子: control 对话框 图片 
2015-02-27 12:16
qwe885167759
Rank: 4
等 级:业余侠客
威 望:5
帖 子:148
专家分:259
注 册:2013-3-12
得分:0 
现在图片能读出来了
是recv中缓冲区的大小问题,调成和图片一样大小就能接收到,但是如果是大文件就不怎么好了,怎么弄成分几次接收发送过来的文件。
求各位大侠指点

我本楚狂人,凤歌笑孔丘
2015-02-27 13:46
天使梦魔
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
得分:20 
你的缓冲区就是一个显示区,实际显示图片必须放在内存。
可以按行扫描也可以缩放方法类似png的交错。
你觉得可能有数据还没穿完就显示全部的理论吗
2015-02-27 23:17
天使梦魔
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
得分:0 
又不是音频,有缓冲区说法,音频可以进行缓冲每次加载5mb播放。
你图片怎么缓冲?每次加载10像素然后把前面的给撤销了?

如果你网络连接问题,那和最终数据无关。每次下载一些等待数据接收完后显示。
或者上面说的按行扫,或者缩放算法,前提是发送的数据包要带缩放编码形式比如png交错。
但没接到全部数据是没办法全部显示的
2015-02-27 23:24
qwe885167759
Rank: 4
等 级:业余侠客
威 望:5
帖 子:148
专家分:259
注 册:2013-3-12
得分:0 
回复 4楼 天使梦魔
如果我要发一个图片文件,有10000张,是不是要先扫描最大的图片,然后按最大的图片大小来设置buffer大小,还有一个是我要传输大的压缩文件怎么弄?

我本楚狂人,凤歌笑孔丘
2015-02-28 10:45
天使梦魔
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
得分:0 
回复 5楼 qwe885167759
看你怎么去弄了。
没必要按最大文件去设置,也可以按每次文件大小new出来就可以了,传完了delete一次。
也可以设置固定大小,不管图片多大都每次传送这么一些,每个文件末不足的就按最后一点发送。(现在下载工具不就是这个机制么,迅雷里面可以设置缓冲区,所谓的缓冲区就是这个意思,不过它那个是为了保护硬盘,每次在内存里填够i个大小然后往硬盘写入,经量避免频繁访问硬盘,当然如果设置过大,除了消耗内存外突然的断电会损失前面的时间)
2015-02-28 12:39
qwe885167759
Rank: 4
等 级:业余侠客
威 望:5
帖 子:148
专家分:259
注 册:2013-3-12
得分:0 
回复 6楼 天使梦魔
版主有没有一个例子给我参考一下,或者相关的书籍参考一下

我本楚狂人,凤歌笑孔丘
2015-03-01 12:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-442226-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.247092 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved