- PR -

VB.NET ActiveモードでのFTP処理について その2

1
投稿者投稿内容
かえで
常連さん
会議室デビュー日: 2004/09/16
投稿数: 38
投稿日時: 2005-07-13 15:07
大変お世話になっております。

前回に続き、またActiveモードでのFTP処理について質問があります。
LISTでの一覧取得、RETRでのファイルDownLoadはなんとかできるようになりました。

最後に悩んでいるのがファイルのUPLOADです。
現在はSTOR命令を発行し、TcpListenerを使用してSocket.Sendを行っております。

lclsDataConSocket = tcpListener.AcceptSocket()

Dim bytBuffer(1024) as byte
lclsUploadFileFS = New FileStream("C:\\Test.Jpg", FileMode.Open)
intBytes = lclsUploadFileFS.Read(bytBuffer, 0, bytBuffer.Length)

Do While (intBytes > 0)
  lclsDataConSocket.Send(bytBuffer, intBytes, 0)
  intBytes = lclsUploadFileFS.Read(bytBuffer, 0, bytBuffer.Length)
Loop

これを実行した結果、Test.Jpgが1024バイトもしくは2048バイトと最後まで転送されていませんでした。(本来は56Kのファイル)

原因を調べた結果、送信の間隔が200ミリ秒以下になってくると、複数の電文がくっついて受信されることが判明しました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=10497&forum=7

そこで今度は1回SendしたあとにSleep(300)と入れ、再度実行したら転送はうまく行きました。
しかし、これではファイルの転送にあまりにも時間がかかりすぎてしまいます。

何かもっと綺麗な転送方法というものは無いものでしょうか?

ご存知の方がいらっしゃったらご教授願います。


甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-07-13 15:34
TCPに関する知識不足です。一度TCPについてきちんと学習したほうが良いです。@ITのTCP/IP関連トピックを全て読むだけでもずいぶん違うと思います。
引用:

かえでさんの書き込み (2005-07-13 15:07) より:
大変お世話になっております。
Do While (intBytes > 0)
  lclsDataConSocket.Send(bytBuffer, intBytes, 0)
  intBytes = lclsUploadFileFS.Read(bytBuffer, 0, bytBuffer.Length)
Loop


Sendは送信バッファにデータをおくと直ちに処理が戻ってきます。ネットワークの速度はHDDほど高速ではありませんから、上記のコードで多量のデータを送信すると、送信バッファのサイズをオーバーしてエラーになります。Socket.Sendメソッドの戻り値が0になっていませんか?

送信キューに空きがあるか(送信可能か?)調べるにはSelectメソッドを使います。Selectメソッドが書き込み可を返すなら送信する。書き込み不可なら、可になるまで待つ必要があります。

Blocking SocketかNetworkStreamを使うと、そのあたりの処理をOSやクラスライブラリにお任せできます。
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
かえで
常連さん
会議室デビュー日: 2004/09/16
投稿数: 38
投稿日時: 2005-07-13 15:57
甕星様
ご指摘ありがとうございます。
今回がいい機会なので、しっかりTCPについて学ぼうと思います。

またNetworkStreamについても知識があまり無い為、しっかり調べた上で対応を考えようと思います。
1

スキルアップ/キャリアアップ(JOB@IT)