为什么我的Python socket.shutdown在Windows上有效但在Ubuntu上无效?
这是我写的套接字代码,主要是用于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
。只需要直接关闭这个套接字,或者干脆不在这个套接字上发送数据,也不去读取数据。