【问题标题】:Python not listening on any port that I specifyPython 没有监听我指定的任何端口
【发布时间】:2016-06-03 18:27:32
【问题描述】:

我正在执行simple Python socket tutorial. 我使用初始化套接字

import socket
import sys
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Bind the socket to the port
server = socket.gethostname()
port = 8080
server_address = (server,port)
sock.listen(1)

但是当我使用 netstat -ntulp 检查我的 Ubuntu 机器正在侦听的端口时,我得到了

...
tcp    0   0 0.0.0.0:49064     0.0.0.0:*        LISTEN   12505/python 
...

它正在侦听端口49604 而不是端口8080!请注意,我已经尝试了从424247806 的许多不同端口;未使用的随机端口。

为什么我的程序没有监听我定义的端口?

【问题讨论】:

  • 忘记绑定socket了吗?
  • 你没有做任何会改变你的套接字端口号的事情,所以它使用默认值。
  • 我忘记绑定我的套接字了。谢谢你们!

标签: python sockets server port


【解决方案1】:

实际的绑定部分仅存在于您的 cmets 中,而不存在于您的代码中。拨打bind:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 8080
sock.bind(('', port)) # actually bind
sock.listen(1)

请注意,我更改了地址。如果您想从任何地方都可以到达,请像这里一样传入一个空字符串。如果您只想从 localhost 访问,请传入 'localhost'(或者 ::1 用于您真正应该使用的 IPv6 套接字)。

由于多种原因,传递机器名称是错误的;因为机器名称被解释为 DNS 名称。可能会出现许多错误或问题:

  • 在最好的情况下,/etc/hosts 中有一个与 localhost 匹配的条目。按照规范,对于 IPv4,此条目是 127.0.0.1。
  • 稍微糟糕的是,当您的代码在类似 debian 的系统上运行时,主机名解析为 127.0.1.1。现在您的服务可以在该 IP 下访问,但不是 127.0.0.1。
  • 如果机器名称不在/etc/hosts 中(这种情况经常发生在更改不完整的情况下,并且某些系统设置它,例如 chrooted onces),您将触发 DNS 解析,希望在本地网络。在最好的情况下,您会得到一个结果,您现在可以在计算机的网络 IP 地址下的本地网络中的每个人使用(如果您有多个,则随机选择)。您的服务将可用于联系 localhost 的应用程序。
  • 更糟糕的是,无论出于何种原因,名称解析都可能失败。
  • 更糟糕的是,名称解析可能会成功,但实际上不会返回您机器的 IP 地址,或者返回您机器的未路由地址。这将彻底失败,或者您将监听一个没人再使用的地址,因此您的服务将基本上无法访问。
  • 更糟糕的是,您的查询可能会泄露到 Internet,这可能会导致有人强迫您的服务向全世界开放。

在最好的情况下,绑定到您的主机名将彻底失败。在最坏的情况下,它可能仅靠运气在某些应用程序上工作,但在许多其他机器上却失败了。绑定'localhost''',或者让用户配置IP;取决于您是否希望您的服务仅对本地计算机、所有人或用户配置的子集可用。

【讨论】:

  • 感谢您的详细解答和背景资料!
  • 现在这样的回答太少见了。
【解决方案2】:

正如 SergeyA 和 kindall 提到的,您忘记绑定您的套接字。添加

sock.bind(server_address)

到你的程序的底部,将你的套接字绑定到一个特定的端口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    相关资源
    最近更新 更多