首页
社区
课程
招聘
C++多线程对多线程的文件传输 如何设计?
发表于: 2014-12-27 12:58 7527

C++多线程对多线程的文件传输 如何设计?

2014-12-27 12:58
7527
客户端启动多个线程传输文件  服务端接收,请问怎么设计才好?我想肯定分为三个方面,一个是如何分包,二是传输接收组合,三是如何检查包的损坏重传。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
TCP。不需要损坏重传,你想太多了。。

分包只是一个策略而已,包头+包体,足已,,,接收其实就是防止多线程写文件而已,可以把打开的句柄保存起来,不用每次去打开。。节约时间。
2014-12-27 13:18
0
雪    币: 25
活跃值: (477)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
3
第一  TCP也并不保险,在网络情况差也会频繁丢包
二   一个2M的文件就要分包了,C++一个数据包再大也是有限制的
三   如何解决多线程传输的协议问题,就是收包 发包  如何定协议
2014-12-27 13:24
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
第一个包上传分块信息:每块编号、大小、偏移和HASH
每传完一个块 服务端通知你下一块偏移和大小
2014-12-27 14:21
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
毕业设计?
2014-12-27 14:34
0
雪    币: 2155
活跃值: (29)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
首先,多线程是用来处理并发任务的。。。
例如:
你的服务器传输是面向多个客户端的,你可以给每一个接入的客户分配一个线程来处理。。。
又或者你要传输大量的零碎文件,你可以让每一个文件对应一个线程来处理。。。
当然线程个数也是有上限的。。。物极必反嘛。。。
但是如果你是想把一个文件分解成N份,用N个线程来传输,那就没有什么意思了。。。

关于分包,你在应用层只需要保证你的文件分片可以正常传输就可,每个文件分片内部交由TCP协议自己解决ACK和重传问题。。。例如一个文件按一片4KB大小分开,一次发送4K数据+2字节CS+2字节size,客户端收到后计算这4K的校验和和CS中的是否一致,一致就请求下一片,不一致就请求重传一次。。。

当然了,有些时候UDP也是一个很好的选择。。。
2014-12-27 16:34
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
假设100M,客户端10线程发送,第一个线程发送0-10240,第二个发送10241-20480。......如此类推。服务端共用一个文件句柄,收到数据后,写入指定的数据到指定偏移,至于分包之类,自己看怎么做合适就好,比如一次64k
2014-12-27 16:41
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
可以使用hpsocket,基于iocp的,高性能,高稳定性
2014-12-27 17:08
0
雪    币: 25
活跃值: (477)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
9
不好意思   说错了,其实这个问题是,多个客户端对应多个服务端线程的处理,如何标示,丢包之后的处理,服务端线程处理结束是退出还是休眠,客户端线程处理结束是退出还是休眠,如果退出就必然下次包来了又要重新创建,如果休眠如何标示对应的线程,还有如果出现了丢包,线程就会一直休眠,占用资源。
2014-12-27 17:45
0
雪    币: 25
活跃值: (477)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
10
多对多的包传输,感觉有点晕。
2014-12-27 17:51
0
游客
登录 | 注册 方可回帖
返回
//