2012-10-07 87 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。再次是我匆忙的代码的结果。我在实际的代码中修正了这个问题。第三点评论,客户不会断开连接。 –