动态感觉 静观其变

居住地:江西南昌,msn:xlp223(at)hotmail.com,gmail talk:myhat123(at)gmail.com, 欢迎交流。喜欢python,也喜欢rails框架。

逝者如斯
网志分类
· 所有网志
· python学习
· pylons学习
· erlang学习
· ruby学习
· linux
· dotnet
· java
· 其他动态语言
· 感想心得
· ice学习
· 生活琐事
· 其他小玩意
搜索本站
友情链接
· 我们的小歪
· 管理我的Blog
· limodou的学习记录
· ywl51
· 花钱的年华
· python资料
· hd的blog
· oneZ
· hgf
· devin's braindump
· pylons
· sqlalchemy
· michael
· xyb
· kjd
· eiffelqiu
· okpython中国

订阅 RSS

0170961

歪酷博客


« 上一篇: 自动部署的小利器 下一篇: 功夫熊猫见功夫 »
Hzg @ 2008-06-06 14:30

不知道为什么总是会碰到一些问题?filezilla server安装在windows xp上有个问题,经常会第一次连接挂死。抽空换了它,最近看到一个python ftpd的库,很有意思,非常小,是异步方式的,我想对我来说足够了,我把它做成windows service,让它自动运行起来,不用管它了。

http://code.google.com/p/pyftpdlib/

文档都不错,还有例子,我就照搬了,然后把windows service的套上去:

import win32serviceutil
import win32service
import win32event

from pyftpdlib import ftpserver

FTP_USER = 'nps_card'
FTP_PASS = 'nps_card'
HOME_DIR='d:\nps_data\'

class MyFtpd(object):
    def __init__(self):
        self.ftpd = None

    def main(self):
        # Instantiate a dummy authorizer for managing 'virtual' users
        authorizer = ftpserver.DummyAuthorizer()

        # Define a new user having full r/w permissions and a read-only
        # anonymous user
        authorizer.add_user(FTP_USER, FTP_PASS, HOME_DIR, perm='elradfmw')
        authorizer.add_anonymous(HOME_DIR)

        # Instantiate FTP handler class
        ftp_handler = ftpserver.FTPHandler
        ftp_handler.authorizer = authorizer

        # Define a customized banner (string returned when client connects)
        ftp_handler.banner = "pyftpdlib %s based ftpd ready." %ftpserver.__ver__

        # Instantiate FTP server class and listen to 0.0.0.0:21
        address = ('', 21)
        self.ftpd = ftpserver.FTPServer(address, ftp_handler)

        # set a limit for connections
        self.ftpd.max_cons = 256
        self.ftpd.max_cons_per_ip = 5

    def start(self):
        # start ftp server
        self.ftpd.serve_forever()

    def stop(self):
        self.ftpd.close_all()

class MyService(win32serviceutil.ServiceFramework):
    """NT Service."""
    
    _svc_name_ = "PyFtpService"
    _svc_display_name_ = "Py Ftp Service"

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        # create an event that SvcDoRun can wait on and SvcStop
        # can set.
        self.stop_event = win32event.CreateEvent(None, 0, 0, None)
        self.myftpd = MyFtpd()

    def SvcDoRun(self):
        self.myftpd.main()
        self.myftpd.start()
        # now, block until our event is set...
        win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE)
   
    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        self.myftpd.stop()
        win32event.SetEvent(self.stop_event)

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(MyService)


然后用另外一个ftp client的库,ftputil,

http://ftputil.sschwarzer.net/trac

随后,做好server,放到实际环境下实验,结果发现还是存在问题,估计就是外网和内网之间的互联互通上的防火墙的问题,也会造成没有响应,后来发现去掉service,server端看日志,发现server并没有退出,但是不响应,看看例子上的代码,有个地方我删除了,有可能就是nat的问题,加上:

ftp_handler.masquerade_address = '10.146.x.188'

passive_ports的范围,似乎nat也做了限制,我不规定范围了。

代码改好之后,好像还是有点问题,还是有点晕,谁了解这些,可以和我说说么?期待有人和我说说。。。

曾经的这一天...


评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定