【问题标题】:twisted.internet.error.CannotListenError: Couldn't listen on any:80: [Errno 13] Permission deniedtwisted.internet.error.CannotListenError:无法监听任何内容:80:[Errno 13] 权限被拒绝
【发布时间】:2012-12-15 06:20:49
【问题描述】:

我目前正在做一个在 mac os 山狮上创建 TCP 服务器的项目。我写了一个脚本叫:Server.py

在这个 python 脚本中,我使用了 twisted 来监听端口 80,如下所示:

reactor.listenTCP(80, factory)
reactor.run()

我怎么会遇到这样的错误:

File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/posixbase.py", line 436, in listenTCP
    p.startListening()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/tcp.py", line 641, in startListening
    raise CannotListenError, (self.interface, self.port, le)
twisted.internet.error.CannotListenError: Couldn't listen on any:80: [Errno 13] Permission denied.

我在想是不是因为 tcp.py 脚本对管理员用户有错误的权限?或者有没有办法在端口

欢迎任何更好的解决方案。

【问题讨论】:

    标签: macos tcp twisted


    【解决方案1】:

    只需转到终端并键入 sudo python server.py。现在它会询问密码,输入您的密码。你的问题将得到解决。快乐编码

    【讨论】:

    • 帮帮我。但是你能解释一下为什么我们在开始时需要“sudo”吗?
    • 1024以下的端口需要root才能打开。
    【解决方案2】:

    我使用命令 sudo + 启动服务器解决了这个问题。

    【讨论】:

    • 帮帮我。但是你能解释一下为什么我们在开始时需要“sudo”吗?
    • 在操作系统中,默认情况下有一些只有管理员才允许的操作。将“sudo”放在命令之前然后提供用户凭据基本上意味着您正在授权这样的操作。启动服务器意味着允许访问互联网,这可能会带来安全威胁,因此只有这台机器的管理员才可以这样做是有道理的。
    • 感谢您提高我的知识。
    【解决方案3】:

    听起来您走在正确的轨道上。按照惯例,只有超级用户(或者,在一些较新的系统中,是被授予某些特殊权限的普通用户)才允许绑定到 1024 以下的端口。

    authbind 工具是向非超级用户授予此权限的便捷方式。似乎有一个 OS X 端口,https://github.com/Castaglia/MacOSX-authbind(虽然我自己只在 Linux 上使用过 authbind)。

    另一种方法是为您启动绑定端口并将其交给您的 Twisted 程序。这种方法更典型地是你可能会发现人们在 OS X 上所做的事情,并且是使用(最近引入的)IReactorSocket.adoptStreamPort API 完成的。有关如何配置它以及您的 Twisted 程序将如何了解它所采用的套接字的详细信息,请参阅 launchd 文档。

    【讨论】:

    • twisted.internet.error.CannotListenError:无法监听任何内容:80:[Errno 48] 地址已在使用中。你有没有遇到过这样的错误。对于论坛上的大多数帖子,[Errno 98] 被抱怨很多,但不是 48。我确实使用“lsof -i :80”检查绑定到此端口 80 的正在运行的进程,然后将它们全部杀死,包括网络浏览器使用“sudo kill PID”。但是,问题仍然存在。我现在很困惑。
    • 即使当前没有程序在侦听端口,也可能正在使用端口。在正在侦听它的程序退出(或以其他方式关闭侦听套接字)后长达两分钟,TCP 连接可能会保持在 TIME_WAIT 状态。这些可以防止新的套接字监听端口。然而,Twisted 使用 BSD 套接字 API 的 SO_REUSEADDR 特性来避免这个问题。
    • 因此,尽管您有时可能会看到“地址已在使用”错误,即使在没有程序再监听端口之后,这可能不是这里发生的情况。更有可能某些程序确实仍在使用该端口。 Web 浏览器极不可能监听端口 80,因此您可能会误解工具的输出。再次检查。
    【解决方案4】:

    也许你的 tcp46 正在使用你的 80。 关掉你的 APACHE,一切都会好起来的。

    sudo apachectl 停止

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-20
      • 2011-06-11
      • 2014-07-15
      • 2015-07-17
      • 2016-07-25
      • 2013-06-12
      • 2016-05-07
      • 2013-05-02
      相关资源
      最近更新 更多