Python没有监听我指定的任何端口

时间:2016-06-03 18:27:32

标签: python sockets server port

我正在执行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;没有使用的随机端口。

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

2 个答案:

答案 0 :(得分:4)

实际的绑定部分仅出现在您的评论中,而不是您的代码中。致电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地址,也不会返回计算机的未路由地址。这将彻底失败,或者您将收听任何人不再使用的地址,因此您的服务基本上无法访问。
  • 更糟糕的是,您的查询可能会逃到互联网上,这可能会让某人强迫您的服务向全世界开放。

在最好的情况下,绑定到您的主机名将彻底失败。在最糟糕的情况下,它可以通过纯粹的运气适用于某些应用程序,但在许多其他机器上失败。绑定到'localhost''',或让用户配置IP;取决于您是希望您的服务仅对本地计算机,每个人或用户配置的子集可用。

答案 1 :(得分:1)

正如SergeyA所说,你忘了绑定你的插座。添加

sock.bind(server_address)

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