こんにちは、ジムと申します。
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
以前出来ていたのなら、このコードに特に問題は無いのでは。。
他のソフトではアップロードできるのでしょうか?
他のFTP転送ソフト(NEXTFTP)では転送できました。
また、問題のプログラムをよそで(友達の家)で動かしたところ
アップできました。
INTERNET_INVALID_PORT_NUMBER を
INTERNET_SERVICE_FTP に
変えて見るとか。
コピペを間違えました。
× INTERNET_SERVICE_FTP に
○ INTERNET_DEFAULT_FTP_PORT に
m(__)m
回答ありがとうございます。やってみます
INTERNET_INVALID_PORT_NUMBER を
INTERNET_DEFAULT_FTP_PORT に
変えてみましたが、うまくいきません。
ファイアーウォールがブロックしてるなんてことは
無いですよね。
WINDOWS 2000 なのでファイアーウォール設定はないと思います。
>WINDOWS 2000 なのでファイアーウォール設定はないと思います。
えーと、ノートンが入ってるとか。
社内LANでプロキシを通してるとか。。。
まずFTPで接続する相手は何ですか?
IISのFTP?
それともUNIX等のFTP?
Windowsの場合、パッシブモードとアクティブモードの両方使えますが
UNIX系の場合、どちらだったか、片方のモードを嫌うFTPサーバー
もありますので。
http://support.microsoft.com/default.aspx?scid=kb;ja;283679
ご参考までに。
以上。
接続相手は、ロリポップサーバーです。
パッシブモード、アクティブモードがわかりません。
ロリポップサーバー?
調べたら、ロリポップは、パッシブモードしかFTPはサポートしていない
とサポートページに記載がありました。
よって、自作FTPの場合、通常はデフォルトでアクティブモードですので
パッシブになるようにしないといけません。
APIを使う場合のモード変更は、レジストリをいじるしか手が無いようで
す。
逆にソケット通信から作成した場合は、パッシブは簡単に実現できるのです
が・・・
どうしても自作で・・・と言うことであれば、レジストリをいじるしか手が
ないようです。
ご参考までに・・・
※ googleで検索したら、この手のことは、結構すぐに検索できましたの
で、お調べになっては?
以上。
いろいろ調べたところ
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ってどこかにないでしょうか?
Baba Centerfolds:
http://www.hi-ho.ne.jp/babaq/
に行ってみましょう。
# というか、まず調べると、↑が出ると思う...
>>オショウさん
>調べたら、ロリポップは、パッシブモードしか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はマルチスレッドはうまく動かない。残念!
何かの原因でハングしたら、フォームの右上の×を押してプログラムを終了する方法も
有るが、いまいちかな。
パッシブモードではないと転送ができなくなったのは、僕がルーターをいじった
せいだと思います。どこをどう変えたかはわからなくなりましたが、初期化して
最初から接続idとパスワードを設定しなおしてみますよ。
>ただしこれはマルチスレッドで、VB6はマルチスレッドはうまく動かない。残念!
呼び出し側に制御が戻ってくるようにする方法はないの?
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を使用する方法があります。
ところでタイムアウトの設定ですが、今回のトラブルの様に、サーバーから
データーを送りたくても、クライアントのポートがブロックされている状況では、
タイムアウトが発生してリトライしても、結局は何回もタイムアウトが発生するだけで、
根本的な対策にはなりません。
また正しい設定で接続すれば、タイムアウトが発生する可能性はかなり低く、
タイムアウトの設定が出来なくても、そんなに不便は感じないと思いますが。
ツイート | ![]() |