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

Python select.select()参数文件描述符不能是负整数错误,python,sockets,select,server,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.sel

我正在用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)

这完全是因为我不太了解select,文档也没有帮助。有人能解释一下为什么会这样吗?

我知道很久没有人问过这个问题了。但我想让OP和其他人知道这里的问题。 这里的问题是SOCKET_列表必须包含一个不存在的SOCKET连接,该连接可能已在前面断开。如果您将此连接传递给select,则会出现此错误

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

解决这个问题的一个简单方法是将
select
块放在try-except块中,然后捕获错误。当发现错误时,可以从套接字列表中删除连接。

我碰巧也遇到了这个问题,我已经解决了它。 我希望这个答案能帮助大家。 关闭的套接字的文件号将变为-1。 很可能是因为slelect的输入参数列表中有一个闭合的套接字。 也就是说,在选择周期中,当您的判断逻辑被添加到rlist、wlist、xlist时,这些逻辑可能有问题。 虽然简单而粗糙的方法是尝试除去带有负fileno的套接字。
但我建议你重新组织你的逻辑。如果不确定,请使用rlist、wlist和xlist而不是list,以避免列表中出现重复元素。

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

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]

尝试仅在select调用中插入“打印套接字列表”。SOCKET_列表中最有可能的一个文件描述符是负数。我试过了,它只是无限地打印[]。
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]