select.select()参数文件描述符不能是负整数错误

时间:2017-10-09 13:02:14

标签: python sockets select server

我正在使用python 3.6.1中的一个简单的聊天应用程序供个人使用。我用select.select得到了这个错误:

Traceback (most recent call last):
  File "C:\Users\Nathan Glover\Google Drive\MAGENTA Chat\chat_server.py", line 
27, in <module>
    ready_to_read,ready_to_write,in_error = select.select(SOCKET_LIST,[],[],0)
ValueError: file descriptor cannot be a negative integer (-1)

以下是代码:

    ready_to_read,ready_to_write,in_error = select.select(SOCKET_LIST,[],[],0)

这完全是因为我不理解选择得很好,文档没有帮助。有人可以解释为什么会这样吗?

3 个答案:

答案 0 :(得分:1)

我知道问这个问题已经有很长时间了。但是我想让OP和其他人知道这里的问题。 这里的问题是,SOCKET_LIST必须包含一个不存在的套接字连接,该套接字连接可能先前已断开连接。如果您通过这种连接进行选择,则会出现此错误

ValueError: file descriptor cannot be a negative integer (-1)

一个简单的解决方案是将select块放入try-除外块中,并捕获错误。发现错误后,可以从SOCKET_LIST删除连接。

答案 1 :(得分:0)

我也碰巧遇到了这个问题,并且已经解决了。 希望这个答案对大家有帮助。 关闭的套接字的文件号将变为-1。 因此很可能是因为slelect的输入参数列表中有一个封闭的插座。 也就是说,在选择周期中,将您的判断逻辑添加到rlist,wlist,xlist时,这些逻辑可能会出现问题。 尽管简单粗暴的方法是try-except,但使用负文件号删除套接字。 但是我建议您重新组织逻辑。如果不确定,请使用rlist,wlist和xlist代替列表,以避免列表中重复元素。

答案 2 :(得分:0)

如果未正确初始化服务器套接字,则可能无法正常工作。 尝试以下代码:

HOST = '127.0.0.1' # '' =  all available interfaces
PORT = 9009        # Arbitrary non-privileged port
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
sock.setblocking(0) # non-blocking I/O
sock.bind((HOST, PORT))
sock.listen(5) # queue up as many as 5 connect requests 
SOCKET_LIST = [sock]