不知道为什么总是会碰到一些问题?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也做了限制,我不规定范围了。
代码改好之后,好像还是有点问题,还是有点晕,谁了解这些,可以和我说说么?期待有人和我说说。。。
