做了类似QQ的东西,当然和QQ比差远了.就是向某个人传文件的速度很慢,但传过去的文件是完整的.传的过程中双方有一次确认收到包的握手.还有发送的包如果比较大(几十K,当然不会超过65535 BYTE的)时,丢包很严重,如果包只有几K时情况好的多.但发7M的文件要10分钟还多一点.QQ就快多了.
想问一下各位兄弟有没有什么高见?
实在不行我想用2条线程发,对方用2条收了.
想问一下各位兄弟有没有什么高见?
实在不行我想用2条线程发,对方用2条收了.
也就是说用UDP协议按流的方式发送文件,速度会很快。
个人觉得对于UDP传送可以使用类似于断点续传的机制.在建立握手时,传送文件的大小,同时在接收方创建文件并做出空间分配,同时还可以直接传送一个文件的分块规划,关存于一个信息数组当中.另外再加上一个ID号,比如可以考虑使用GUID,占位长度为16Byte,再加一个顺序号(由顺序号还能确认该数据在文件当中的Position),这样子就当是使用超大文件unsigned __int64,最大值18446744073709551615ULL,也就占8个字节,就算是传文件的起始Position也没有多少耗用.网络环境好一点,包可以稍加大一点可以提高效率.而使用GUID主要是为了方便多点传送,单点传送,就只需要传一个位置即可.但是要记得将未决信息进行存盘,在方便续传.
慢的话就多线程啊都已经很成熟的技术了
再慢就是网络问题了
其实还可以通过合理利用网络来提高速率,用的好也能提高不少网速。那就是合理设置每次发送的数据大小:假设我们每次send的数据为2K,并且使用TCP方式的话,是没有合理利用网络的。以太网报文最大为1518,减去4个字节的CRC,减去14个字节的帧头,减去20个字节的IP头,减去20个字节的TCP头,每个报文传送的有效数据为1460字节。那么2K(2048字节)就得分为2个报文发出去,第一个报文传1460字节,第二个报文传588字节。可以看见第二个报文只利用了一半的网络。假设我们每次send的数据为2920字节,那么分两次发出去的都是满承载的1518字节的报文,就最大限度的利用了网络带宽。以上说的TCP的情况,最好设为1460的倍数。UDP也是一样的算,这就大家自己去算了。如果有人认为我说的不对请自己在自己电脑上抓包看一下就知道了,毕竟事实胜于雄辩。