Gen*_* S. 3 c# c++ java memory ftp
如果我的FTP客户端打算上传大小超过4演出的文件,假设我正在流式传输数据,那么如果它是一个32位指针,那么我的指针将会在4 gigs左右撞墙,对吧?我试图想象幕后发生了什么,并且我无法想象它是如何工作的......但是它必须工作,因为我过去已经下载了大于此的文件.
所以,我的问题是两个......在客户端上发生了什么(它需要是一个64位客户端,在64位机器上)以及服务器上发生了什么(IT也必须是64位机?)
我意识到该文件将被分解为较小的文件进行传输,但是只是试图解决超出4,294,967,295标记的文件部分,程序是否会爆炸?
我认为这是一个相关的帖子,但我不确定他们得出的结论.答案似乎都指出了指针(在它们的情况下为PERL)和操作系统的局限性. 为什么我的Perl程序不能在Windows上创建超过4 GB的文件?
客户端或服务器应该以块的形式读取数据(我会做多个页面大小或类似的东西)并将块写入磁盘.不需要一次将整个文件放在RAM中.
在接收端有类似这样的伪代码(错误检查和类似的省略):
chunk = new byte[4096];
while(int size = recv(socket, chunk, 4096)) {
write(file, chunk, size);
}
Run Code Online (Sandbox Code Playgroud)
所以上面的示例是针对服务器的,客户端也会做类似的事情.
chunk = new byte[4096];
while(int size = read(file, chunk, 4096)) {
send(sock, chunk, size);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
解决你的评论.你必须要记住的一件事是文件中的偏移量在32位系统上不一定是32位,它可以是64位,因为它实际上不是一个指针,它只是一个偏移量文件的开头.如果操作系统支持64位偏移(现代windows/linux/osx都支持),那么你不必担心它.如其他地方所述,操作系统试图访问的文件系统也是一个因素,但我想如果你有一个大于4GB的文件,那么它显然是在支持它的文件系统上;-).