0

我采用了苹果的简单 FTP 示例并根据需要对其进行了编辑。(没有改变上传部分)

它报告上传正常,并且文件确实在 FTP 上,但是如果我下载文件并打开它(主要是 jpg 图像),我会收到文件已损坏的错误消息。

我唯一改变的是,当传输完成后,连接被强制关闭,而不是继续等待其他上传。

我认为该程序正在将最后一块数据分配给上传流,一旦完成,它就假定它已经完成,而无需等待流上传最后一块..这可能吗?有没有办法查看网络流(输出流)的缓冲区中是否有数据?我似乎只能为输入流做到这一点,但不能为输出流做到这一点。

更新:在使用十六进制编辑器将上传的文件与原始文件进行比较后,我发现这些文件是相同的,除了上传的文件的最后部分被砍掉了。切掉的部分并不总是相同的大小。它在 0 到 256 kb 之间变化...

UPDATE2:
NSLog(@"ntstrm: %zu", self.networkStream.streamStatus); 即使在上传时也总是返回 2。上传时它应该返回 4!然后在关闭后它返回 0。但从不返回 4 ......

UPDATE3:到目前为止,我发现的唯一解决方案是在我关闭连接之前放入一个计时器并等待 15 秒。但这不是我想做的事情,因为我用来上传许多文件的程序,如果对于每个文件,我必须停止 15 秒,这是一个巨大的痛苦。任何帮助表示赞赏。

4

1 回答 1

0

由于缺少任何代码片段,因此提出解决方案并不容易。

根据您的问题描述,这可能与缓冲区未正确刷新有关。

我建议您尝试在输出流上强制立即刷新。也想避免套接字延迟的人使用 TCP_NODELAY 只是在套接字级别设置了一些选项:

int yes = 1;
setsockopt(CFSocketGetNative(aSocket), IPPROTO_TCP, TCP_NODELAY, (void *)&yes, sizeof(yes));

希望这可以帮助。

于 2013-05-01T17:51:15.120 回答