为什么我的python的socket.shutdown在Windows上工作但不在Ubuntu上工作?

时间:2014-03-02 02:18:01

标签: python sockets windows-7 udp ubuntu-13.10

这是我的套接字代码的样子,这是用于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包裹起来试试这里的解决方案,还是会在骑行中遇到令人讨厌的问题?

1 个答案:

答案 0 :(得分:3)

您正在 UDP 套接字上呼叫sock.shutdown()。 UDP没有关闭连接。在Windows上,除了阻止您写入和读取套接字(数据包仍然接收并排队)之外,调用没有太大作用,在Linux上调用UDP连接上的关闭会引发错误。

在任何一种情况下,你都不应该真正使用shutdown。只需关闭套接字,或者只是不发送套接字而不从中读取数据。