select.select() arguments 文件描述符不能是负整数错误
Posted
技术标签:
【中文标题】select.select() arguments 文件描述符不能是负整数错误【英文标题】:select.select() arguments file descriptor cannot be a negative integer error 【发布时间】:2018-03-20 16:56:00 【问题描述】:我正在使用 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)
这完全是因为我不太了解 select ,并且文档没有帮助。有人可以解释为什么会这样吗?
【问题讨论】:
尝试仅在 select 调用中插入“print SOCKET_LIST”。 SOCKET_LIST 中的一个文件描述符很可能是负数。 我试过了,它只打印 [我知道这个问题已经很久没有提出来了。但我想让 OP 和其他人知道这里的问题。 这里的问题是 SOCKET_LIST 必须包含一个不存在的套接字连接,该连接可能在之前已经断开。如果你通过这样的连接来选择它会给出这个错误
ValueError: file descriptor cannot be a negative integer (-1)
一个简单的解决方案是将select
块放入try - except 块中并捕获错误。当发现错误时,可以从 SOCKET_LIST 中删除连接。
【讨论】:
【参考方案2】:我也遇到了这个问题,已经解决了。 我希望这个答案对大家有所帮助。 关闭套接字的文件号将变为-1。 所以很可能是因为slelect的输入参数列表中有一个关闭的socket。 也就是说,在select循环中,当你的判断逻辑添加到rlist、wlist、xlist时,这些逻辑可能会出现问题。 虽然简单粗暴的方法是 try-except 删除带有负 fileno 的套接字。 但我建议你重新组织你的逻辑。如果您不确定,请使用 rlist、wlist 和 xlist 代替列表,以避免列表中出现重复元素。
【讨论】:
【参考方案3】:如果您没有正确初始化服务器套接字,它可能无法正常工作。 试试这个代码:
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.select() arguments 文件描述符不能是负整数错误的主要内容,如果未能解决你的问题,请参考以下文章