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

FTPログイン時のアプリハングについて

環境/言語:[Windows2000 .NET2003 Framework 2]
分類:[.NET]

こんにちは。

FTPについて教えていただき書き込みさせて頂きました。

クライアント WINDOWS XP(開発は2000なんです。。。)
FTPサーバー WINDWOS 2003 server

アプリはVB.NET2003を使用しています。

下記コードのFTPログイン処理を呼び出し時に、
プログラムがハング?してしまいました。
(Drワトソンやイベントビューアには落ちた形跡はありませんでした)

1度起きたきりで、再現もせず、現象の原因も判断つきません。
なにとぞお知恵をお貸しください。


**−−−−以下ソース−−−−**
Public Function Login() As Boolean

'ソケットオブジェクト生成
m_objClientSocket = _
New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

'接続情報セット
Dim ep As New IPEndPoint(Dns.Resolve(m_sRemoteHost).AddressList(0), m_iRemotePort)

'接続
Try
m_objClientSocket.Connect(ep)
Catch ex As Exception
MessageString = m_sReply
Throw New IOException("Cannot connect to the remote server")

End Try
'接続結果 検証
ReadReply()
If (m_iRetValue <> 220) Then
CloseConnection()
MessageString = m_sReply
Throw New IOException(m_sReply.Substring(4))
End If

'ログイン:ユーザ設定
SendCommand("USER " & m_sRemoteUser)
If (Not (m_iRetValue = 331 Or m_iRetValue = 230)) Then
Cleanup()
MessageString = m_sReply
Throw New IOException(m_sReply.Substring(4))
End If
'ログイン:パスワード
If (m_iRetValue <> 230) Then
SendCommand("PASS " & m_sRemotePassword)
If (Not (m_iRetValue = 230 Or m_iRetValue = 202)) Then
Cleanup()
MessageString = m_sReply
Throw New IOException(m_sReply.Substring(4))
End If
End If

m_bLoggedIn = True
flag_bool = True

'ディレクトリの移動
ChangeDirectory(m_sRemotePath)

'リターン
Return m_bLoggedIn
End Function
> 下記コードのFTPログイン処理を呼び出し時に、
> プログラムがハング?してしまいました。

  そういうことは、このようなコーディング方法では発生
  するかと・・・

  例えば、ReadRply() で無限待ちになっているとか。

  あくまで一定時間待っても受信されない場合、タイムア
  ウトして処理を戻すような・・・

  非同期通信で尚且つ受信タイムアウトする前提にコーデ
  ィングされることをお勧めします。

以上。
返信ありがとうございます。

ソース自体はココのものを参考にしています。(ほぼそのままなんですが。。。)
http://support.microsoft.com/default.aspx?scid=kb;ja;832679

>   そういうことは、このようなコーディング方法では発生
>   するかと・・・
>
→いろいろ見直してみているのですが、いまいち何がわるいのか
 わからなく。。。

>   例えば、ReadRply() で無限待ちになっているとか。
→この関数はコネクトのコマンドの応答文字列を取得しているだけなので、
 正常値かもしくは、処理になにかってもエラーを返すだけだと思っています。

>   あくまで一定時間待っても受信されない場合、タイムア
>   ウトして処理を戻すような・・・
→セッションのタイムアウトの設定方法がわからない状態でして。。。
 loginを別スレッドで呼び出して、一定時間立っても応答がなければ切る
 とかでよいでしょうか?

>   非同期通信で尚且つ受信タイムアウトする前提にコーデ
>   ィングされることをお勧めします。
→もうすこし、勉強したいと思います。。。
> ソース自体はココのものを参考にしています。(ほぼそのままなんですが。。。)
> http://support.microsoft.com/default.aspx?scid=kb;ja;832679

  そこのは私も以前見たことありましたが・・・

>>  例えば、ReadRply() で無限待ちになっているとか。
> →この関数はコネクトのコマンドの応答文字列を取得しているだけなので、
>  正常値かもしくは、処理になにかってもエラーを返すだけだと思っています。

  思ってるのでは、ダメなんじゃ〜ないですか?
  ちゃんと機能を確認しないと。

> →セッションのタイムアウトの設定方法がわからない状態でして。。。
>  loginを別スレッドで呼び出して、一定時間立っても応答がなければ切る
>  とかでよいでしょうか?

  パケットの非同期送受信とログインの動作を分けると言う
  ことになろうかと。

http://www.planet-source-code.com/vb/scripts/BrowseCategoryOrSearchResults.asp?lngWId=10&B1=Quick+Search&optSort=Alphabetical&txtCriteria=FTP&blnWorldDropDownUsed=TRUE&txtMaxNumberOfEntriesPerPage=10&blnResetAllVariables=TRUE

  ソケット通信でFTPしているの、そこそこあるんじゃ〜
  ないですか・・・

以上。参考まで
返信ありがとうございます。

> >>  例えば、ReadRply() で無限待ちになっているとか。
>>→この関数はコネクトのコマンドの応答文字列を取得しているだけなので、
>> 正常値かもしくは、処理になにかってもエラーを返すだけだと思っています。
>
>   思ってるのでは、ダメなんじゃ〜ないですか?
>   ちゃんと機能を確認しないと。
→ 失礼しました。コマンドに対する結果の文字列を取得し、
  処理に使用しているだけです。

>>→セッションのタイムアウトの設定方法がわからない状態でして。。。
>> loginを別スレッドで呼び出して、一定時間立っても応答がなければ切る
>> とかでよいでしょうか?
→タイムアウトの設定 ReceiveTimeout、SendTimeoutがありました。
 デフォルトは0で無制限待ちになるようです。
 試験的に確認したいのですが、任意でタイムアウトが起こせず確認が。。。

>   パケットの非同期送受信とログインの動作を分けると言う
>   ことになろうかと。
→自分の中で咀嚼しきれてませんが、下記のサイトを参考にして勉強したいと思います。


> http://www.planet-source-code.com/vb/scripts/BrowseCategoryOrSearchResults.asp?lngWId=10&B1=Quick+Search&optSort=Alphabetical&txtCriteria=FTP&blnWorldDropDownUsed=TRUE&txtMaxNumberOfEntriesPerPage=10&blnResetAllVariables=TRUE
>
>   ソケット通信でFTPしているの、そこそこあるんじゃ〜
>   ないですか・・・
→ありがとうございます。参考にして見たいと思います。
> →タイムアウトの設定 ReceiveTimeout、SendTimeoutがありました。
>  デフォルトは0で無制限待ちになるようです。
>  試験的に確認したいのですが、任意でタイムアウトが起こせず確認が。。。

  1ミリ秒とかにすれば、そこまで早いレスポンスは無いかも・・・
  ローカルネットワークの場合は、それでも無理かもしれませんネ!

※ 私も2002/2003のころは、ソケット通信でFTPする為にどこからか
  サンプルコード引っ張ってきて改造してやりました。
  あると思うのでがんばって下さい!

以上。
こんにちは。

返信が遅れてすいません。

いろいろアドバイスありがとうございました。
とりあえずタイムアウト等いれて、改修したので
いろいろ試験をして見たいと思います。

まだ、解決!!とまではいきませんがとりあえずは
解決済み!!しちゃい、何かあった時に復活させたいと思いますので、
その時はお願いします。
解決済み!

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