Python Twisted: 如何为本地连接使用不同的资源层次?

3 投票
1 回答
942 浏览
提问于 2025-04-16 17:59

我想为本地连接使用一种资源层级,而为其他所有连接使用另一种资源层级。我该怎么做呢?

publicSite = Site(File("/var/www/"))
localhostSite = Site(File("/var/localhost/"))

publicServer = TCPServer(80, publicSite, interface="0.0.0.0")
localhostServer = TCPServer(80, localhostSite, interface="127.0.0.1")

看起来你不能同时监听两个不同的接口。

我遇到了以下错误:

Traceback (most recent call last):
File "/usr/bin/twistd", line 21, in <module>
  run()
File "/usr/lib/python2.5/site-packages/twisted/scripts/twistd.py", line 27, in run
  app.run(runApp, ServerOptions)
File "/usr/lib/python2.5/site-packages/twisted/application/app.py", line 379, in run
  runApp(config)
File "/usr/lib/python2.5/site-packages/twisted/scripts/twistd.py", line 23, in runApp
  _SomeApplicationRunner(config).run()
File "/usr/lib/python2.5/site-packages/twisted/application/app.py", line 158, in run
  self.postApplication()
File "/usr/lib/python2.5/site-packages/twisted/scripts/_twistd_unix.py", line 213, in postApplication
  startApplication(self.config, self.application)
File "/usr/lib/python2.5/site-packages/twisted/scripts/_twistd_unix.py", line 174, in startApplication
  service.IService(application).privilegedStartService()
File "/usr/lib/python2.5/site-packages/twisted/application/service.py", line 228, in privilegedStartService
  service.privilegedStartService()
File "/usr/lib/python2.5/site-packages/twisted/application/internet.py", line 68, in privilegedStartService
  self._port = self._getPort()
File "/usr/lib/python2.5/site-packages/twisted/application/internet.py", line 86, in _getPort
  return getattr(reactor, 'listen'+self.method)(*self.args, **self.kwargs)
File "/usr/lib/python2.5/site-packages/twisted/internet/posixbase.py", line 467, in listenTCP
  p.startListening()
File "/usr/lib/python2.5/site-packages/twisted/internet/tcp.py", line 733, in startListening
  raise CannotListenError, (self.interface, self.port, le)
twisted.internet.error.CannotListenError: Couldn't listen on 127.0.0.1:80: (98, 'Address already in use').

1

1 个回答

4

对于第二个服务器,不要绑定到 0.0.0.0,而是绑定到你服务器上的一个或多个公共地址。Twisted没有提供可以列出主机上地址的接口,也没有办法区分公共地址和私有地址(因为你的“公共”地址可能是 10.x.x.x,而防火墙可能会将流量从一个真正的公共地址转发过来)。

如果你需要发现自己的地址,而不是通过配置提供这些地址,那么在POSIX系统上,这个ioctl示例可能会对你有帮助

撰写回答