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 中的一个文件描述符很可能是负数。 我试过了,它只打印 [] 无限。 【参考方案1】:

我知道这个问题已经很久没有提出来了。但我想让 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 文件描述符不能是负整数错误的主要内容,如果未能解决你的问题,请参考以下文章

select模块select IO多路复用和select实现FTP

layui的select实现联动,能不能select后追加

下拉框:<select> </select>

select2 取值 赋值

select2 取值 赋值

jQuery Select2 - 如何隐藏 Select2 Optgroup