1

最初に、少し背景を説明します。私は、個人プロジェクト用の基本的な FTP サーバーを作成しています。現在、ファイルの取得に取り組んでいます。私の現在の実装は次のようになります。

HANDLE hFile = CreateFile("file.tar.gz", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
TransmitFile(sd, hFile, fileSize, 65536, NULL, NULL, TF_USE_KERNEL_APC | TF_WRITE_BEHIND); 
CloseHandle(hFile);

動作しますが、パフォーマンスには疑問があります。最初は、転送は約 10 MB/秒で始まりますが、ゆっくりと約 3 MB/秒まで減少します。FileZilla Server と IIS FTP を使用して、30 MB/秒を超える一貫した転送速度を維持します。したがって、私はそれが十分に機能していないことを知っています。バッファサイズをいじってみましたが、パフォーマンスは向上しません。ファイルを転送するためのより効率的な方法について提案がある場合は、お知らせください。API ドキュメントは、TransmitFile が私のアプリケーション用に最適化されていることを示唆しているようです。
[Windows API の知識がないことをお許しください。]

また、すべてのソケットは localhost で開かれます。

4

3 に答える 3

4

SO_SNDBUF送信を開始する前に、およびSO_RCVBUFソケット オプションを設定して、ソケットの TCP バッファ サイズ (および場合によっては TCP ウィンドウ サイズ) を増やしましたか? (バインド後、接続前に行う)?

問題の音から、開始が速くなり、その後速度が低下することから、TCP フロー制御の問題であると推測されます (おそらく、TCP ウィンドウが希望よりも小さいため)。Wireshark を使用してデータ フローを確認すると便利です (上記で提案した変更の前後が理想的です)。

見る:

于 2010-01-05T08:12:46.550 に答える
0

TransmitFile がここで使用する適切な関数であることを確認することを除いて、 MSDNはここではあまり役に立たないようです。これはもう試しましたか?

hファイル

TransmitFile 関数が送信する開いているファイルへのハンドル。オペレーティング システムはファイル データを順番に読み取るため、FILE_FLAG_SEQUENTIAL_SCAN でハンドルを開くことにより、キャッシュのパフォーマンスを向上させることができます。

編集: 次のステップとして、FileZilla がどのように機能するかを確認することをお勧めします (これはオープン ソースですよね?)。TransmitFile はパフォーマンスの高い関数として記述されていますが、おそらく Windows API を使用することはこれを行うのに最適な方法ではありません。

于 2010-01-04T23:16:02.123 に答える
-1

コードに TransmitFile を追加しようとしましたが、パフォーマンスはひどいものでした。ダウンロードを開始する前に、20 秒間そのままでした。

どこにも明確に文書化されていませんが、何らかの方法で非同期であるようにも見えることを読みました。さらに、特定の操作を間違ったタイミングで行うと、アプリケーションがクラッシュする可能性があるようです: social.msdn.microsoft.com

ドキュメンテーションが不十分でパフォーマンスが悪い == 私の本では使用しないでください。ファイルを byte[] にロードして出力に書き込むのは、2 行の C# です...

于 2010-01-29T21:35:31.110 に答える