プロが教えるわが家の防犯対策術!

現在CentOS上でPythonのftplibを使用したプログラムを作成しているのですが、
動作上問題が生じて、私の力では解決出来ませんでしたので質問させて頂きます。

問題というのは、ファイルをダウンロード中に何らかの形で通信が途切れると、
エラーが発生しないまま処理が止まってしまう、というものです。

以下にコードを記します。


ftp = FTP(host)

ftp.login(user, passwd)

fp = open("file.jpg", "wb")

ftp.retrbinary("RETR file.jpg", fp.write)

fp.close()

ftp.quit()


希望としては、通信が切断された際に例外処理を行いたいと考えています。
解決策や代替案をお持ちの方がいらっしゃいましたら、お力添えお願いします。

A 回答 (2件)

うっかりしていました・・・



TCPでは、無通信状態でのネットワーク障害の検知はちょっと厄介ですね。
TCPに付いてくるKeepAliveを利用する手もありますが、本格的に使用すると
なると力不足だった記憶があります。

import socket
ftp.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)

あとは、自前で無意味なデータ照会を定期的に繰り返し、応答がタイムアウト
した場合はネットワーク障害とみなす方法があります。
(大抵の有名ドコロのFTPクライアントはこちらの実装ではないでしょうか)
    • good
    • 0

おそらくですが、処理が止まるのは次のデータを待っているからでは?


TCP接続の基礎ですね。

タイムアウト時間を短くしてみるのも手です。

class ftplib.FTP([host[, user[, passwd[, acct[, timeout]]]]])¶(原文)
(中略)
オプションの timeout 引数は、コネクションの接続時など、ブロックする操作におけるタイムアウト時間を秒数で指定します。 (指定されなかった場合、グローバルのデフォルトタイムアウト設定が利用されます。)

バージョン 2.6 で変更: timeout が追加されました。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!