这是我的套接字代码的样子,这是用于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的一些风格。我可以在try catch中包装socket.shutdown
[docs] 调用,一切似乎都能正常工作。
这个问题是否与Windows和Linux处理套接字的方式有所不同?试着把sock.shutdown
包裹起来试试这里的解决方案,还是会在骑行中遇到令人讨厌的问题?
答案 0 :(得分:3)
您正在 UDP 套接字上呼叫sock.shutdown()
。 UDP没有关闭连接。在Windows上,除了阻止您写入和读取套接字(数据包仍然接收并排队)之外,调用没有太大作用,在Linux上调用UDP连接上的关闭会引发错误。
在任何一种情况下,你都不应该真正使用shutdown
。只需关闭套接字,或者只是不发送套接字而不从中读取数据。