Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python select()中的filedescriptor超出范围-文件描述符泄漏?_Python_Sockets_File Descriptor - Fatal编程技术网

Python select()中的filedescriptor超出范围-文件描述符泄漏?

Python select()中的filedescriptor超出范围-文件描述符泄漏?,python,sockets,file-descriptor,Python,Sockets,File Descriptor,我已经为python的socket模块编写了一个包装器,其中我使用select.select和一个只包含有超时的socket对象的rlist,以便允许有超时的recv。它看起来或多或少像这样: def recv(self, timeout): ready, _, _ = select.select([self.socket], [], [], timeout) if ready: return self.socket.recv(4096) return "

我已经为python的socket模块编写了一个包装器,其中我使用select.select和一个只包含有超时的socket对象的rlist,以便允许有超时的recv。它看起来或多或少像这样:

def recv(self, timeout):
    ready, _, _ = select.select([self.socket], [], [], timeout)
    if ready:
        return self.socket.recv(4096)
    return ""
所以它主要做的是等待套接字准备好超时秒;如果到那时还没有准备好,它将返回一个空字符串,如果已经准备好,它将接收其中的内容,一般限制为2字节的幂次

这通常效果很好;但是,最近我开始在代码的select行中遇到异常,如下所示:

ValueError: filedescriptor out of range in select()
def close(self):
    self.socket.close()
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.host, self.port))
self.socket.setblocking(0)
我编写的程序使用了我编写的包装器,它是一个运行几个小时的脚本。看起来每次我运行它时,它都会在大约40分钟后失败,并出现此值错误。看来我的文件描述符有漏洞。但是,这些只是套接字,我相信我正在正确地关闭它们,因为我的包装器的.close方法如下所示:

ValueError: filedescriptor out of range in select()
def close(self):
    self.socket.close()
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.host, self.port))
self.socket.setblocking(0)
我正在使用python 2.7。我对我的问题理解不够透彻,无法生成一个完整的运行示例来演示我的问题

编辑 包装套接字对象的初始化如下所示:

ValueError: filedescriptor out of range in select()
def close(self):
    self.socket.close()
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.host, self.port))
self.socket.setblocking(0)

从“select”模块的文档中:您也可以自己定义一个包装类,只要它有一个适当的fileno方法,该方法真正返回一个文件描述符,而不仅仅是一个随机整数。如文件中所述。你的包装器类有'fileno'方法吗?我没有选择我的包装器类;我正在选择它包装的内容,这是一个真正的python套接字对象self.socket。