在Python中初始化TCP连接的问题--阻塞和超时

1 投票
2 回答
666 浏览
提问于 2025-04-17 04:39

我在做一个课堂项目,想用Python进行一些套接字编程,但遇到了一个非常基础的问题。我无法从我的笔记本电脑建立到实验室机器的TCP连接。(我希望把它当作“服务器”来用)在没有深入到我写的脚本之前,我只是尝试了一些解释器的命令,但都没有成功。在实验室机器(kh4250-39.cselabs.umn.edu)上,我在Python中输入了以下内容:

from socket import *
sock = socket()
sock.bind(('', 8353))
sock.listen(5)
sock.accept()

然后在我的笔记本电脑上,我输入了:

from socket import *
sock = socket()
sock.connect(('kh4250-39.cselabs.umn.edu', 8353))

此时,两台机器都卡住了,什么都不做,直到客户端超时或者我发送了SIGINT信号。这个代码几乎是我从网上找到的例子和Mark Lutz的书《Programming Python》中复制过来的(使用''作为服务器主机名显然是使用操作系统默认值,这种做法相当常见)。如果我在自己的电脑上同时运行这两个程序,并使用'localhost'作为主机名,那就没问题,所以我怀疑是我在一端或两端使用的主机名出了问题。我真的不确定在这么简单的例子中会出什么错。有没有人知道可能是什么原因?

2 个回答

0

试着把服务器绑定到 'kh4250-39.cselabs.umn.edu',而不是绑定到空字符串 '':

sock.bind(('kh4250-39.cselabs.umn.edu', 8353))

如果这样还不行,可能是因为防火墙阻止了 8353 端口的连接……

1

确认是不是防火墙问题的一个好方法是,在命令行中用 telnet 命令连接到你想要访问的目标主机:

% telnet kh4250-39.cselabs.umn.edu 8353
Trying 128.101.38.44... 

然后过一段时间:

telnet: connect to address 128.101.38.44: Connection timed out

如果它一直停留在 Trying 状态,最后超时了,那很可能是防火墙在阻止你连接到那个特定端口的远程主机。这种阻止可能发生在网络层面(比如真实的防火墙或路由器的访问列表),也可能是在主机上,比如使用 iptables 或其他主机级的过滤机制。

访问这个实验室主机可能只能在实验室或校园网络内进行。你可以和你的教授、网络管理员或者对网络比较了解的人聊聊,确认一下具体情况。

撰写回答