2014-03-02 29 views
0

這是我的套接字代碼的樣子,這是一個UDP連接。爲什麼我的python的socket.shutdown在Windows上工作,但不是Ubuntu?

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 

我不知道是什麼OS主機運行的相關部分,我想這就是Linux的一番風味。我可以包裝socket.shutdown[docs]調用嘗試捕獲,一切似乎工作正常。

此問題與Windows和Linux處理套接字的方式有什麼區別嗎?在這裏試圖抓住這個解決方案來包裝sock.shutdown,還是我會在這個問題上執行令人討厭的問題?

回答

3

您正在致電sock.shutdown()上的UDP插座。 UDP沒有連接關閉。在Windows上,調用除了阻止你寫入和讀取套接字(數據包仍然接收和排隊)之外,並沒有做其他事情,在Linux上調用UDP連接上的關閉會引發錯誤。

在這兩種情況下,根本不應該使用shutdown。只需關閉套接字,或者不要發送套接字,也不要從套接字讀取數據。

相關問題