DOBON.NET DOBON.NETプログラミング掲示板過去ログ

FTPクライアントのクローズ

環境/言語:[VB.NET]
分類:[.NET]

2004/07/20(Tue) 23:45:26 編集(投稿者)
2004/07/20(Tue) 23:43:54 編集(投稿者)
2004/07/20(Tue) 23:43:46 編集(投稿者)

はじめまして、
夜分遅くすみません。VB.NETで
FTPについて教えていただきたいのですが、

パッシブモードで接続をし、
STORでサーバにファイルを書き込み、
その後データを全て書き終わった後に、
戻ってくるメッセージが150のみで、
226が返ってきません。
ちなみに、ファイルは中身まで全てサーバに
正常にアップロードされています。

なぜでしょうか?

そして、自らデータコネクションをクローズさせようと、
Ftpclient.Close()
を使ってもデータコネクションが
クローズしません。

データコネクションのクローズの仕方も
教えていただきたいのですが。

あいまいな質問の書き方ですみません。
誰かわかる人がいましたらお助けください。
お願いします。
> そして、自らデータコネクションをクローズさせようと、
> Ftpclient.Close()
> を使ってもデータコネクションが
> クローズしません。

現在の.NET Frameworkには、FTPを簡単に扱うためのクラスは用意されていません。
というわけでそのFtpClientはどなたかの作られたクラスだと思いますので、
作者に問い合わせましょう。
というか作者にしかわからないと思います。。
> 現在の.NET Frameworkには、FTPを簡単に扱うためのクラスは用意されていません。
> というわけでそのFtpClientはどなたかの作られたクラスだと思いますので、
> 作者に問い合わせましょう。
> というか作者にしかわからないと思います。。

返事が全然来なくてちょっと
へこんでました。
お返事ありがとうございます。

ちょうどFTPを簡単に扱うためのクラスがないので、
FTPのプロトコルに基づき、
FTPを自作しています。。。

FtpClient.Close()
というのは書き間違いで、
TcpClient.Close()
でした。
ご指摘ありがとうございます。

そして質問です。
TcpClient.Close()
では、データコネクションのクローズは
できないのでしょうか?

誰か詳しい方いらっしゃらないでしょうか?
よろしくお願いします。
KENさん、こんばんは。

英語版ならサンプルソースがあったはず・・・
http://www.mentalis.org/apilist/f.shtml
少しはヒントになるかも…
■No4962に返信(KENさんの記事)

 KENさん、こんばんは。深山と申します。
 FTP に詳しい訳ではないので的外れかも知れませんけど‥‥

> パッシブモードで接続をし、
> STORでサーバにファイルを書き込み、
> その後データを全て書き終わった後に、
> 戻ってくるメッセージが150のみで、
> 226が返ってきません。
> そして、自らデータコネクションをクローズさせようと、
> Ftpclient.Close()
> を使ってもデータコネクションが
> クローズしません。

 226 が返ってくるのはデータコネクションが切断された後のようなので、
正しい動作なのではないかと思います。
 しかし、どうして Close メソッドでクローズ出来ないのかは解りません。
『クローズしない』というのがどういう状態を指してるのかもよく解らないのですけど
SocketException が発生するということでしょうか?
 また、 NetworkStream の Close メソッドは正常に行われているのでしょうか?


 ところで関係ないかも知れませんが
> STORでサーバにファイルを書き込み、
> その後データを全て書き終わった後に、
> 戻ってくるメッセージが150のみで、
の件が気になりました。

 1. STOR コマンドでファイル名を送信(制御コネクション)
 2. レスポンスコード 150 を受信(制御コネクション)
 3. データコネクション確立
 4. ファイルデータ送信(データコネクション)
 5. データコネクション切断
 6. レスポンスコード 226 受信(制御コネクション)

という流れになるかと思うのですけど、上述のは手順が異なるような気がして。
 単に省略して書かれてたということでしたら流して下さいませm(__)m
■No4962に返信(KENさんの記事)

日本語のサイトでは
CSharp Code Source
http://members.jcom.home.ne.jp/1213687801/tookun.html
に、FTPのサンプルが掲載されています。
http://members.jcom.home.ne.jp/1213687801/cs/general/ftp1.html
http://members.jcom.home.ne.jp/1213687801/cs/general/ftp2.html
http://members.jcom.home.ne.jp/1213687801/cs/general/ftp3.html
みなさま丁寧にお返事くださって
本当にありがとうございます。

深山さん>
ご丁寧にありがとうございます。
 
>226 が返ってくるのはデータコネクションが切断された後のようなので、
>正しい動作なのではないかと思います。
>しかし、どうして Close メソッドでクローズ出来ないのかは解りません。
>『クローズしない』というのがどういう状態を指してるのかもよく解らないので>すけどSocketException が発生するということでしょうか?

 1. STOR コマンドでファイル名を送信(制御コネクション)
 2. レスポンスコード 150 を受信(制御コネクション)
 3. データコネクション確立
 4. ファイルデータ送信(データコネクション)
 5. データコネクション切断
 6. レスポンスコード 226 受信(制御コネクション)

→4までは確認することができました。本来サーバにファイルがアップロードされ完了するとデータコネクションが自動に切断され、レスポンスコード226を返すはずなのですが、データコネクションが切断されないため、自らデータコネクションをクローズさせようとしたのですが、TcpClient.Close()を行ってもデータコネクションがクローズしないという状況です。データコネクションを切断させる方法は他にあるのでしょうか?ちなみに「NetworkStream の Close メソッド」は使っていません。この方法でも切断できるのでしょうか?

NowhereManさん>
サイトの紹介ありがとうございます。見てみます。

またわかる方いらっしゃいましたら、よろしくお願いいします。
■No5024に返信(KENさんの記事)

 KENさん、こんにちは。深山です。

> >『クローズしない』というのがどういう状態を指してるのかもよく解らないので
> >すけどSocketException が発生するということでしょうか?
> TcpClient.Close()を行ってもデータコネクションがクローズしないという状況です。

 えっと、その『クローズしない』というのを(『レスポンスコード 226 が返されてこない』
という以外の)何で判断しているのかを知りたかったのですけど(^_^;)
 話の流れ的に例外が発生している訳ではないということで良いのですよね?

> ちなみに「NetworkStream の Close メソッド」は使っていません。この方法でも切断できるのでしょうか?

 TcpClient クラスを使ってらっしゃるようでしたので、データを送信する際には GetStream メソッドで
取得した NetworkStream を使用しているかと思います。
 TcpClient の Close を行う前に、この NetworkStream の Close を行う必要があるかと
思うのですけど‥‥それで状況が変わるかどうかは定かではありませんm(__)m



# NowhereManさんがご紹介されていたサイトのコードを見てみました。
# こちらは Socket クラスで通信を行ってましたね。
深山さん>
ご返信ほんとありがとうございます。
答え方あいまいですみません・・・。
クローズしていないというのは、途中途中に
TcpClient.Active()を挿入して確認していました。

そこで一つわかったのですが、
try catchを抜けた時点でデータコネクションがクローズ
されていました。
ここのtry catchの間には、データ送信までを
記述しています。
本来このtry catch のなかで、データが送信された
後にデータコネクションが切断され226が返ってくる
のではないかなぁと思っていたのですが・・・。
しかし、try catch が終了した後に
226のメッセージを取りに行こうとしても
返ってきません。


>データを送信する際には GetStream メソッドで
>取得した NetworkStream を使用しているかと思います。

データの送信はThreadクラスのメソッドを使いバイトデータ送信
をしています。なので、NetworkStream を使用していません。
ここらへんの知識が少ない中で書いているため、
色々いっていることが矛盾していたりするのですが
お許しくださいm(__)m
■No5040に返信(KENさんの記事)

 KENさん、こんにちは。深山です。

> クローズしていないというのは、途中途中に
> TcpClient.Active()を挿入して確認していました。

 ? Active() ?
 TcpClient クラスには確かに Active というメンバが存在します。けれども、これはメソッドではなく
プロパティ、しかもプロテクト メンバです。
 作成しているクラスというのは TcpClient を継承していて、且つ ”()” を付けたのは転記ミスと
いうことなのでしょうか?

 仮にそうだとしても、Me.Active で参照可能なのはデータコネクションではなく、制御コネクションに
なってる方が自然のような気がします。現状どういった構成になっているのでしょう?

> >データを送信する際には GetStream メソッドで
> >取得した NetworkStream を使用しているかと思います。
> データの送信はThreadクラスのメソッドを使いバイトデータ送信
> をしています。なので、NetworkStream を使用していません。

 Thread クラスのメソッドでデータ送信‥‥ですか?
 ThreadStart デリゲートで参照されているメソッド内で送信処理を行っている、ということ
でしたらまだ解るのですけど‥‥すいません、どういう通信処理になっているのかちょっと想像が
つきませんでした。

 差し支えないようでしたら、先に書いてた手順の 3 〜 5 に相当するコードを掲載されては
いかがでしょう? より適切なアドバイスをして下さる方がいらっしゃるかも知れません。


> ここらへんの知識が少ない中で書いているため、
> 色々いっていることが矛盾していたりするのですが
> お許しくださいm(__)m

 いえいえ、私の方こそよく知りもしないで話している部分が多々ありますし‥‥(^_^;)
# FTP 関係も思い切り付け焼刃です(汗) 変なこと言ってたらツッコミよろしくお願いしますm(__)m

DOBON.NET | プログラミング道 | プログラミング掲示板