ffftp quick hack

ftp client の定番の一つ、曽田さん作の ffftp を簡易チューンしてみる。

目的
「転送速度向上と(わずかな)使い勝手向上」

備考
かなり手抜きな修正。無保証。

出来上がり品(ソース+バイナリ)
ffftp(v1.92) quick hack

運良く、本家にこれらが取り込まれたら、このページは消滅させる予定(笑)
(v1.90 で一部取り込まれました。2002/12/16)

2002/10/16 作成
2003/05/11 更新

以下、変更内容やテスト結果など。私的メモより抜粋

2003/05/11

v1.92 が出たようなので、ffftp quick hack 版も更新。

2002/12/16

ffftp v1.90 で、転送速度向上部分は、オリジナルに取り込まれたけれど、
使い勝手向上部分は(おそらくポリシー的な面から)取り込まれなかったよう
なので、v1.91 を対象に hack したものを、一応作成してみた。

2002/12/12

ffftp

ffftp の v1.90 がリリースされ、 v1.89 の速度向上を図ったffftp quick hack
内容がオリジナルに取り込まれた模様(2002/12/11 参照)。

ただ、quick hack 版では(quick hack ゆえに)オリジナルのヘッダを変更せず、
ソース内で、
#undef BUF_SIZE
#define BUF_SIZE 大きいサイズ
としていた部分があったのだけれど、この部分もそのまま使われている模様(笑)

…本当は、ヘッダのオリジナルの define を直してもらうほうが綺麗なんですが(^^;

2002/10/16

ffftp の quick hack(その3)

現状の仕様(挙動)で、若干、使いにくい点。
ローカルファイルを選択した後、upload 先のディレクトリを選ぶと、upload ボタンが
disable になってしまう。そのため、再度、ローカル側ファイルを選択する必要があり、
2度手間になってしまう。

フォーカスを失っても、ファイルが選択されていれば、upload/download ボタンが
disable にならない quick hack第2版 をつくってみた。
(toolmenu.c の MakeButtonsFocus() を修正)

2002/10/01

ffftp の quick hack(その2)

昨日と同じようなテストを client 部分だけ変更して実行してみた。
あまり正確に測っていないけれど、normal版 → quick hack版の向上は大体、以下の通り。
OSマシンupload 速度向上download 速度向上
WinNT4PII/450MHz、256MB RAM3-4MB/s → 8-9MB/s3-4MB/s → 7-8MB/s
Win2KP4/1.4GHz、512MB RAM3-4MB/s → 8-9MB/s6-7MB/s → 8-9MB/s
WinXPP4/2.4GHz、512MB RAM3-4MB/s → 10-11MB/s10-11MB/s → 10-11MB/s

WinNT4 で一番転送レート向上の効果がある様子。ついで Win2K、WinXP の順。
これは、socket buffer のデフォルトサイズがその順番で小さいためかな。
(ただ、昨日に比べて、XP 上での download 速度が伸びているのは謎)

一応、改変したソース+バイナリを置いておきます。
興味のある方がいらっしゃいましたら、追試してみてください。
(上記のアーカイブ、ライセンス的にまずい点があればツッコミください)

2002/09/30

ffftp を quick hack(その1) ffftp のソースを quick hack してみる。 (高速 LAN 上の転送で、いまひとつ速度が出ていない気がしたため)
改変内容:
 getput.c line.29 に以下の3行を挿入。
  #undef BUFSIZE   // quickhack
  #define BUFSIZE (32 * 1024)
  #define SOCKBUF_SIZE (256 * 1024)

 DownLoadFile() 内の char TmpBuf[ONELINE_BUF_SIZE]; の直後に
 以下の行を挿入。
  int buf_size = SOCKBUF_SIZE;
  for ( ; buf_size > 0; buf_size /= 2)
    if (setsockopt(dSkt, SOL_SOCKET, SO_RCVBUF, (char *)&buf_size,
    sizeof(buf_size)) == 0)
       break;

 UploadLoadFile() 内の char TmpBuf[ONELINE_BUF_SIZE]; の直後に
 上記の DownLoadFile() に挿入したコードの SO_RCVBUF を SO_SNDBUF
 に変更したものを挿入。

環境:
 ftp Client ... WinXP (P4/2.3GHz, 512MB RAM)
 ftp Server ... Solaris7 (UltraSPARCII/450MHz(dual), 1GB RAM)
 LAN ... 100BaseTX

テスト:
 300MB ファイルの upload と download を5回繰り返した平均

(従来)
 upload   ... 約 3.8 MB/s
 download ... 約 8.6 MB/s

(変更後)
 upload   ... 約 9.1 MB/s
 download ... 約 10.2 MB/s

作者さんにも一応メールで伝えてみた。
(ただ、基本的なチューンなので、百も承知の可能性大(笑))
加えて、
・upload 時は ReadFile() + send() ではなく mmap した領域を直接 send()
・非同期 WSAAsyncSelect() を thread + 同期 select() に変更
あたりを行うともっと高速化されるかも。
(ちなみに、これらの方法は ipmsg のファイル転送でも使っている)

連絡先:email