【问题标题】:select.select() arguments file descriptor cannot be a negative integer errorselect.select() arguments 文件描述符不能是负整数错误
【发布时间】: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 中的一个文件描述符很可能是负数。
  • 我试过了,它只打印 [] 无限。

标签: python sockets select server


【解决方案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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-13
        • 2015-05-25
        • 2015-05-20
        相关资源
        最近更新 更多