我正在使用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)
这完全是因为我不理解选择得很好,文档没有帮助。有人可以解释为什么会这样吗?
答案 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]