为什么我的Python socket.shutdown在Windows上有效但在Ubuntu上无效?

0 投票
1 回答
1024 浏览
提问于 2025-04-17 20:28

这是我写的套接字代码,主要是用于UDP连接。

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(8)
sock.sendto(req, (host, port))
buf = sock.recv(2048)
sock.shutdown(socket.SHUT_RDWR)
sock.close()

这是我堆栈跟踪中相关的部分。

Exception in thread Thread-6:
Traceback (most recent call last):
  File "udp_test.py", line 110, in my_method
    sock.shutdown(socket.SHUT_RDWR)
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 107] Transport endpoint is not connected

我不知道这个主机运行的是什么操作系统,我猜可能是某种Linux版本。我可以把socket.shutdown[文档]的调用放在一个try catch里,这样一切似乎都能正常工作。

这个问题是否和Windows和Linux处理套接字的方式不同有关?把sock.shutdown放在try catch里算是解决办法吗,还是说这样会在后面引发更麻烦的问题?

1 个回答

3

你在一个UDP套接字上调用了sock.shutdown()。但是UDP没有连接可以关闭。在Windows系统上,这个调用基本上没什么作用,只是让你不能再往这个套接字里写数据和读取数据(不过数据包还是会被接收并排队)。而在Linux系统上,调用这个shutdown会报错。

无论是哪种情况,其实你根本不需要使用shutdown。只需要直接关闭这个套接字,或者干脆不在这个套接字上发送数据,也不去读取数据。

撰写回答