FtpPutFile呼び出しでフリーズを回避するには


ジム  2005-05-25 23:56:28  No: 90057

こんにちは、ジムと申します。
VB6で下記のように記述してファイル転送しようとしましたが、FtpPutFileの
ところでフリーズしてしまいます。ファイルがいけないのかと思い。いろいろ
(テキストファイルの小さなもとか)試してみましたが、1分以上たっても応答
が返ってきません。サーバーの中をのぞいたら、ファイル名だけは作成されている
ようです。以前はこのプログラムでアップロードできていたのですが、なぜかでき
なくなってしまいました。どなたかなぜフリーズするのか。それとフリーズ対策
を教えて下さい。

      '初期化
    lnghInet = InternetOpen(App.EXEName, _
                           INTERNET_OPEN_TYPE_DIRECT, _
                           vbNullString, _
                           vbNullString, _
                           0)
    If lnghInet <> 0 Then
        ' FTP接続処理
        lnghConnect = InternetConnect(lnghInet, _
                                     Text1.Text, _
                                     INTERNET_INVALID_PORT_NUMBER, _
                                     Text2.Text, _
                                     Text3.Text, _
                                     INTERNET_SERVICE_FTP, _
                                     0, _
                                     0)
        If lnghConnect <> 0 Then
            If FtpSetCurrentDirectory(lnghConnect, "TEST2") = False Then
        
                MsgBox "ディレクトリの移動に失敗しました."
                Exit Sub
            End If
        End If
        If lnghConnect <> 0 Then
            '指定したファイルをFTP転送する
            If FtpPutFile(lnghConnect, _
                          Text4.Text, _
                          Text4.Text, _
                          FTP_TRANSFER_TYPE_BINARY, _
                          0) <> 0 Then
                MsgBox Text4.Text & "をFTP転送しました"
            Else
                MsgBox "保存に失敗しました。"
            End If
        End If
    End If


ねろ  2005-05-26 00:44:20  No: 90058

以前出来ていたのなら、このコードに特に問題は無いのでは。。
他のソフトではアップロードできるのでしょうか?


ジム  2005-05-26 01:42:16  No: 90059

他のFTP転送ソフト(NEXTFTP)では転送できました。
また、問題のプログラムをよそで(友達の家)で動かしたところ
アップできました。


ねろ  2005-05-26 03:27:20  No: 90060

INTERNET_INVALID_PORT_NUMBER  を
INTERNET_SERVICE_FTP  に
変えて見るとか。


ねろ  2005-05-26 16:50:39  No: 90061

コピペを間違えました。
× INTERNET_SERVICE_FTP  に
○ INTERNET_DEFAULT_FTP_PORT に
m(__)m


ジム  2005-05-26 19:56:57  No: 90062

回答ありがとうございます。やってみます


ジム  2005-05-26 22:56:22  No: 90063

INTERNET_INVALID_PORT_NUMBER  を
INTERNET_DEFAULT_FTP_PORT に
変えてみましたが、うまくいきません。


ねろ  2005-05-27 02:17:24  No: 90064

ファイアーウォールがブロックしてるなんてことは
無いですよね。


ジム  2005-05-27 04:05:10  No: 90065

WINDOWS 2000 なのでファイアーウォール設定はないと思います。


ねろ  2005-05-27 06:00:32  No: 90066

>WINDOWS 2000 なのでファイアーウォール設定はないと思います。
えーと、ノートンが入ってるとか。
社内LANでプロキシを通してるとか。。。


オショウ  2005-05-27 07:12:19  No: 90067

まずFTPで接続する相手は何ですか?
IISのFTP?
それともUNIX等のFTP?

Windowsの場合、パッシブモードとアクティブモードの両方使えますが
UNIX系の場合、どちらだったか、片方のモードを嫌うFTPサーバー
もありますので。

http://support.microsoft.com/default.aspx?scid=kb;ja;283679

ご参考までに。

以上。


ジム  2005-05-27 23:38:31  No: 90068

接続相手は、ロリポップサーバーです。
パッシブモード、アクティブモードがわかりません。


オショウ  2005-05-28 07:54:30  No: 90069

ロリポップサーバー?
調べたら、ロリポップは、パッシブモードしかFTPはサポートしていない
とサポートページに記載がありました。

よって、自作FTPの場合、通常はデフォルトでアクティブモードですので
パッシブになるようにしないといけません。
APIを使う場合のモード変更は、レジストリをいじるしか手が無いようで
す。

逆にソケット通信から作成した場合は、パッシブは簡単に実現できるのです
が・・・

どうしても自作で・・・と言うことであれば、レジストリをいじるしか手が
ないようです。

ご参考までに・・・

※  googleで検索したら、この手のことは、結構すぐに検索できましたの
    で、お調べになっては?

以上。


ジム  2005-05-28 20:58:33  No: 90070

いろいろ調べたところ

        lnghConnect = InternetConnect(lnghInet, _
                                     Text1.Text, _
                                     INTERNET_INVALID_PORT_NUMBER, _
                                     Text2.Text, _
                                     Text3.Text, _
                                     INTERNET_SERVICE_FTP, _
                                     INTERNET_FLAG_PASSIVE, _
                                     0)

とパッシブを指定すれば、転送できるようになりましたが、
InternetSetOption の不具合により、タイムアウトが設定されないようです。
ですから、最悪プログラムはロックしてしまいます。
これを回避するには、FTP を行う制御を C言語DLLで作成し、その DLL を
VB から呼び出す方法しかないようです。こんなDLLってどこかにないでしょうか?


K.J.K.  2005-05-28 21:12:16  No: 90071

Baba Centerfolds:
http://www.hi-ho.ne.jp/babaq/
に行ってみましょう。
# というか、まず調べると、↑が出ると思う...


ねろ  URL  2005-05-29 00:28:24  No: 90072

>>オショウさん
>調べたら、ロリポップは、パッシブモードしかFTPはサポートしていない
>とサポートページに記載がありました。
そんなこともない様ですよ。
http://lolipop.jp/?mode=support&state=faq&state2=tra&faqid=000053
あくまでもクライアント側の設定なんでしょう。
今まで出来ていたということでパッシブの設定だけは無いと思ったのですが。。。。
ルーターを替えたとか、ルーターの設定を替えたとかそんなことは無いのかな。

>APIを使う場合のモード変更は、レジストリをいじるしか手が無いようです。
質問者の方がやられているようにInternetConnectにはパッシブモードの指定があります。

>これを回避するには、FTP を行う制御を C言語DLLで作成し、その DLL を
>VB から呼び出す方法しかないようです。こんなDLLってどこかにないでしょうか?
http://support.microsoft.com/kb/224318/EN-US/
ただしこれはマルチスレッドで、VB6はマルチスレッドはうまく動かない。残念!
何かの原因でハングしたら、フォームの右上の×を押してプログラムを終了する方法も
有るが、いまいちかな。


ジム  2005-05-29 09:18:37  No: 90073

パッシブモードではないと転送ができなくなったのは、僕がルーターをいじった
せいだと思います。どこをどう変えたかはわからなくなりましたが、初期化して
最初から接続idとパスワードを設定しなおしてみますよ。
>ただしこれはマルチスレッドで、VB6はマルチスレッドはうまく動かない。残念!
呼び出し側に制御が戻ってくるようにする方法はないの?


ねろ  URL  2005-05-30 03:45:07  No: 90074

http://support.microsoft.com/kb/176420/EN-US/
ここに、このタイムアウトのバグは、WinInet.dllを非同期
モードで使う方法と、第2スレッドで使う方法で解決できると有ります。
ところがただし残念なことに
http://www.vbip.com/wininet/index.asp
ここの『FTP Client Sample Application (Only for VB5 and IE 3/4)』
に書いてあるように、VB6からは非同期モードは使用出来ません。(^^;
さらに第2スレッドもVB6からはマルチスレッドがまともに動作せずにだめです。
(まあ両方ともマルチスレッドなんですが。。。。。)
何とかP-Codeコンパイラでは使えそうなんですが、お勧めは出来きません。
ということでWinInet APIではタイムアウトに関しては八方ふさがりです。(^^;
他の方法では『FTPコマンド』で送信する方法、マルチスレッドが使える
『.net』に乗り換える方法、他のDLLを使用する方法があります。

ところでタイムアウトの設定ですが、今回のトラブルの様に、サーバーから
データーを送りたくても、クライアントのポートがブロックされている状況では、
タイムアウトが発生してリトライしても、結局は何回もタイムアウトが発生するだけで、
根本的な対策にはなりません。
また正しい設定で接続すれば、タイムアウトが発生する可能性はかなり低く、
タイムアウトの設定が出来なくても、そんなに不便は感じないと思いますが。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加