2012-10-07 123 views
1

好吧,所以我有Python 2.5和Windows XP。我正在使用select.select和一個套接字對象。我一遍又一遍地嘗試,但每當我運行它時,它所在的線程都會給我一個像select.error(9,「Bad file descriptor」)的錯誤。 代碼是這樣的:Python中奇怪的選擇錯誤

import socket, select 
s = socket.socket() 
s.bind((socket.gethostbyname(socket.gethostname()), 1312)) 
s.listen(5) 
inputs = [s] 
outputs = [] 
while True: 
    r, w, e = select.select(inputs, outputs, inputs) 
    for sock in r: 
     if sock is s: 
      inputs.append(s.accept()[0]) 
     else: 
      print s 
      print s.recv(1024) 

任何信息,將不勝感激。謝謝!

回答

3
  1. 你叫select.select沒有參數。它應該是這樣的:select.select(inputs, outputs, [])

  2. else中,您需要使用sock而不是s(服務器)。

  3. 一旦對端與之前連接的套接字斷開連接,您應該從inputs列表中刪除它。如果sock.recv()返回空字符串或引發socket.error異常,則可以知道對等方已斷開連接。如果你不這樣做,你最終可能會提供一個無效的套接字描述符到select.select,導致你提到的錯誤。

+0

對不起,我錯過了在我的代碼中輸入** select.select(_inputs_,_outputs_,_inputs _)**。我會修復那個 –

+0

酷。我的其他兩個意見仍然適用:) –

+0

LOL。再次是我匆忙的代碼的結果。我在實際的代碼中修正了這個問題。第三點評論,客戶不會斷開連接。 –