传大包文件时有无技巧?

现在我需要通过网络实时传送大包数据,文件有20M,TCP协议,怎样传送可以保证数据完整而且快速呢?每包传送的数据按照多大来取合适呢?传送大包时有时会丢包,但是取的太小传送数据又很长

最快的方法,应该是把20M全部丢给TCP,让协议栈来决定怎样传。

当然,因为通常socket buffer只有22K左右,你的 sendto()或是write()会被阻塞到最后22K复制到socket buffer里为止。

xtang,没太懂,怎么把20M全丢给TCP呢?建立一个20M的buffer,一次将数据全部读出来,再一次sendto()出去?不会这么做吧?

你问哪个最快,这种最快。

如果开20M Buffer你受不了,那就退而求其次,1M x 20次也好, 512K x 40次 也好,看你能开多大Buffer了。

但是现场往往大包传送会丢包,而小包则速度极慢,这怎么控制呢?

我不是完全确信你说的“大包”、“小包”是什么。

你把数据交给协议栈,是一次交20M,还是交20次1M,都没有“包”的概念。协议栈如何切割你的数据,是TCP的事情。切大切小,TCP自己有标准算法。如果有丢包,TCP自己知道应该怎样减少流量。如果数据传递流畅,TCP自己知道如何提速。所以我说,把所有的数据都提交给TCP,一切让TCP来处理是“最优”的。

但是为了可靠传送,用send()函数发送数据时每包的数据总要约定一下吧,如果太大send()还是出错重新传是不是又花费时间呢?

这个已经是被提过好多次的误区了。

TCP是个“流”,不是“包”。(所以开TCP连接时叫SOCK_STREAM)在TCP层上是没有“包”这个概念的。

也就是说,你的一个Send(),并不对应对方的一个Receive()。 如果你每次Send() 1M,发送20次,不是说对方就能用20个Receive()接收下来的。对方的一个Receive,可能收到1M,可能一次收到2M,也可能收到1M加几个字节。只取决于在Receive()时,有多少数据被存放在缓存里了。

如果你真想有包的概念又不失tcp连接的可靠,可以试试SCTP : zh.wikipedia.org/wiki/SCTP