VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 335|回复: 12

[讨论] MFC文件传输

[复制链接]
76_avatar_middle
最佳答案
0 
在线会员 发表于 2020-6-25 20:18:52 | 显示全部楼层 |阅读模式
基于对话框的socket编程如何实现文件传输??
还要自己定义包头吗??
希望有大佬解答,有源码更好,在网上找不到,想了解一下这方面的知识,请大佬帮帮我!!!




上一篇:求各位大佬帮编译这个链表
下一篇:关于ListBox控件
70_avatar_middle
最佳答案
21 
在线会员 发表于 2020-6-26 21:18:45 | 显示全部楼层
Kairt 发表于 2020-6-26 19:25
书上按异步选择模型发送的消息,也没写包头,就是注册异步处理事件,写了两个自定义的消息处理函数。
看 ...
  1. #pragma  pack(push)
  2. #pragma pack(1)
  3. enum MY_MSG_TYPE{MMSG_TYPE_TEXT = 0,MMSG_TYPE_FILE};
  4. struct MsgHead{
  5.         MY_MSG_TYPE msgType;        //消息包的类型: 文本/文件
  6.         char fileName[MAX_PATH];
  7.         //以下两条用于大文件传输,一包放不下的情况
  8.         int packIndex;                        //当前包序号
  9.         int packCount;                        //包总数
  10. };
  11. #pragma pack(pop)
复制代码

你在你每次发的消息的前面额外加个头就可以了,定义一个类似上面的结构体,标明是文本还是文件
用的时候 填好头,然后memcpy 到 你的message前面 把整个发出去就可以了
接收的时候,分析头,去掉头,处理正常消息 就ok了
76_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-26 08:43:41 | 显示全部楼层
看样子很不错啊!~~
70_avatar_middle
最佳答案
21 
在线会员 发表于 2020-6-26 14:05:36 | 显示全部楼层
二进制打开文件 -> socket 传文件名 -> socket传二进制数据 ->
socket接收文件名 和 二进制数据  ->保存文件
76_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-26 16:29:53 | 显示全部楼层
tony666 发表于 2020-6-26 14:05
二进制打开文件 -> socket 传文件名 -> socket传二进制数据 ->
socket接收文件名 和 二进制数据  ->保存 ...

是要实现聊天和文件传输,在文件传输的时候不需要定义包头吗,那在客户端如何区分来的是消息还是文件那?
70_avatar_middle
最佳答案
21 
在线会员 发表于 2020-6-26 16:44:25 | 显示全部楼层
Kairt 发表于 2020-6-26 16:29
是要实现聊天和文件传输,在文件传输的时候不需要定义包头吗,那在客户端如何区分来的是消息还是文件那?

那就只能自己定义了,有个标记能区分就可以了吧,标记个类型、当前包序号、包总数就差不多了。
再说你实现聊天本身也得有个头传递一些相关信息呀,
76_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-26 19:25:02 | 显示全部楼层
tony666 发表于 2020-6-26 16:44
那就只能自己定义了,有个标记能区分就可以了吧,标记个类型、当前包序号、包总数就差不多了。
再说你实 ...

书上按异步选择模型发送的消息,也没写包头,就是注册异步处理事件,写了两个自定义的消息处理函数。
看了之后还是不知道有关文件传输的怎么写啊,大佬求助啊!!!
76_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-27 11:22:04 | 显示全部楼层
tony666 发表于 2020-6-26 21:18
你在你每次发的消息的前面额外加个头就可以了,定义一个类似上面的结构体,标明是文本还是文件
用的时 ...

这个包头是在发送消息或文件时一起发吗,接收端如何解析包头来判断是文件还是消息那,搞不懂啊,大佬求详细讲一下!!!
76_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-27 11:32:10 | 显示全部楼层
tony666 发表于 2020-6-26 21:18
你在你每次发的消息的前面额外加个头就可以了,定义一个类似上面的结构体,标明是文本还是文件
用的时 ...

那个fileName是什么,发送的文件名吗,那发送消息的时候用不到呀。
还是把消息,和文件内容放在fileName里面?

点评

文件名,用不到的时候可以不管他嘛,或者你也可以用变长的头,发消息的时候不加无用属性就可以了  发表于 2020-6-27 23:53
70_avatar_middle
最佳答案
21 
在线会员 发表于 2020-6-27 23:51:51 | 显示全部楼层
Kairt 发表于 2020-6-27 11:22
这个包头是在发送消息或文件时一起发吗,接收端如何解析包头来判断是文件还是消息那,搞不懂啊,大佬求详 ...

每个send都要在前面加一个包头,包头是固定长度的,每次接收的时候先去掉sizeof(MsgHead)就是正文了
76_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-28 09:52:27 | 显示全部楼层
tony666 发表于 2020-6-27 23:51
每个send都要在前面加一个包头,包头是固定长度的,每次接收的时候先去掉sizeof(MsgHead)就是正文了

可不可以每次发消息或文件前,先send一下类型,再送发内容(如果是发消息 就把类型和消息内容一起发;如果是文件 先发送类型和文件名,再send内容),客户端先接受第一个send,如果类型是文件就创建一个处理文件的线程,如果是消息就创建处理消息的线程。这样在各自的线程里处理发来的第二个send。
这样可行吗?
70_avatar_middle
最佳答案
21 
在线会员 发表于 2020-6-29 08:25:30 | 显示全部楼层
Kairt 发表于 2020-6-28 09:52
可不可以每次发消息或文件前,先send一下类型,再送发内容(如果是发消息 就把类型和消息内容一起发;如 ...

可以使肯定可以的,但是这样会更简单更易编码吗,你自己怎么方便怎么来嘛
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-26 05:59

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表