0

Apple の単純な FTP サンプルを使用して、必要に応じて編集しました。(アップロード部分は変更していません)

アップロードが正常に行われたことを報告し、ファイルは実際に FTP 上にありますが、ファイルをダウンロードして開くと (主に jpg 画像)、ファイルが破損しているというエラー メッセージが表示されます。

私が変更した唯一のことは、転送が終了すると、他のアップロードを待って生き続ける代わりに、接続が強制的に閉じられることです。

プログラムはデータの最後のチャンクをアップロードストリームに割り当てていると思います。それが完了すると、ストリームがその最後のチャンクをアップロードするのを待つことなく、終了したと見なされます..それは可能ですか? ネットワークストリーム (出力ストリーム) のバッファにデータがあるかどうかを確認する方法はありますか? 私はそれを入力ストリームに対してのみ行うことができ、出力ストリームに対しては行うことができないようです。

更新:アップロードされたファイルと元のファイルを16進エディターで比較した後、アップロードされたファイルの最後の部分が切り落とされていることを除いて、ファイルが同一であることがわかりました。切り取った部分は常に同じサイズではありません。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 に答える