我应该通过一个读/写或多个块的套接字发送文件吗?

时间:2015-06-06 09:18:56

标签: c++ sockets ftp

我有一个关于如何在c ++中实现基本文件传输client \ server的基本问题。

我不确定为什么在一个read \ write中发送文件不是一个好方法,为什么好方法是将它发送到小缓冲区?

2 个答案:

答案 0 :(得分:5)

  

我不确定为什么在一个read \ write中发送文件不是一个好方法,为什么好方法是将它发送到小缓冲区?

如果你有一个大小为2TB的文件,你首先需要分配这个数量的RAM并将整个文件加载到这个单个缓冲区中。然后你需要写出所有这个缓冲区。无论如何,由于内存不足,这可能无法成功使用2TB文件,但即使对于较小的文件,这也会浪费资源。由于从磁盘读取和对网卡的写入在内部完成,无论如何,即使整个文件适合RAM,也不会获得更好的性能。

A可能会在4k到32k之间的块中读/写,最佳大小取决于操作系统,磁盘缓冲区,套接字缓冲区,磁盘速度和网络等。

答案 1 :(得分:0)

如果您想使用基于IP的协议发送此文件,您无论如何都限制在大约64K的IP数据包大小。

如果您使用UDP,那么您的传输不可靠,但最好还是将数据包大小限制在450字节左右,以避免数据包的某些部分丢失。您还必须在每次发送中设置某种序列号以检测这样的块丢失,并且可能是一种acking机制。 TFTP已经有了这样的机制。

如果您使用可靠的TCP,那么您不必切换450字节,您可以使用32000字节甚至64K(不是TCP的限制,但您可以避免需要大量内存,读取和以32k的块发送是完全合理的)。 TCP将根据Mtu发送。因此,请准备好在接收方,您将不会收到32000的数据包。

出于性能原因,您希望磁盘访问是“更大的块”。每字节读取和发送字节可能会起作用,但速度会非常慢。