2014-09-04 82 views
3

我有以下的UDP类在100Hz左右Python的插座给“[错误24]打开的文件过多”

from six import string_types 
import socket 
import struct 

def convert_data(iterable): 
    if isinstance(iterable, string_types): 
     return str(iterable) 
    data = tuple(iterable) 
    format = "{0}H".format(len(data)) 
    print("Sending data:", format, data) 
    if max(data) > 2**16 - 1: 
     raise ValueError(max(data)) 
    if min(data) < 0: 
     raise ValueError(min(data)) 
    return struct.pack(format, *data) 

class UDP(object): 
    def __init__(self, ip, port): 
     self._ip = ip 
     self._port = port 
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     self.socket.connect((ip, port)) 

    def send_data(self, data): 
     message = convert_data(data) 
     return self.socket.sendall(message) 

它提供了以下错误后发送成功大约一分钟发送数据的阵列:

Traceback (most recent call last): 
    File "take_analogue_data.py", line 13, in <module> 
    File "take_analogue_data.py", line 8, in main 
    File "/home/pi/nio-integration/hardware/raspi/UDP.py", line 22, in __init__ 
    File "/usr/lib/python2.7/socket.py", line 187, in __init__ 
socket.error: [Errno 24] Too many open files 

我找了一个解决方案。 This Stack Overflow answer suggests increasing the number of possible files。我真的不认为这是我正在寻找的解决方案。

有什么我可以做的吗?我以为每次关闭连接都可能奏效,但我已经玩过很多东西了。 (我曾尝试sendsendallsendto - 没有工作过)

注:我在树莓派

编辑 另一个模块发送上Raspbian喘息运行python2.6的数据。它可能看起来像

import UDP 
udp = UDP.UDP(IP, PORT) 
while(True): 
    udp.send_data(range(8)) 
    sleep(0.01) 
+1

你仍然缺少一些代码 - 'send_data'实际上并没有发送任何东西,只需设置一个局部变量并返回即可。 – djmitche 2014-09-04 20:57:13

+2

您发布的代码不会显示您描述的问题。请发布您实际使用的代码。 – duskwuff 2014-09-04 20:58:20

+0

我的代码基本上是这样的......但是,为了证明你错了,我基本上使用了这段代码,并且在几分钟后它仍然没有崩溃。我会说,我可能找到了我的错误的原因,一秒 – vitiral 2014-09-04 21:04:36

回答

5

可能的是,你正在创建的while(True):每一个迭代一个新的套接字。进程仅限于可以打开的文件描述符的数量(套接字为fds)。您可以检查/etc/security/limits.conf以查看设置的限制。

当你完成它的时候,你应该关闭你的套接字,或者,理想情况下,只打开一个套接字并尽可能重用它。

你说你的其他模块“可能看起来像这样。”这段代码片段究竟是什么样子?

我怀疑它,因为如果是这样,应该只能做一个插座。如果您在while内实例化UDP对象,那么上述问题肯定是您的问题。

+1

你是完全正确的,我只是犯了一个初学者的编码错误。谢谢一堆! – vitiral 2014-09-04 21:07:56

1
class UDP(object): 

    def __init__(self, ip, port): 
     self._ip = ip 
     self._port = port 
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     self.socket.connect((ip, port)) 

你必须了解UDP是什么,它是一个会话少,无连接的协议,这意味着:self.socket.connect((ip,int(port)))是不正确的,所以你应该将其删除。

如果你想连接到服务器使用TCP来代替:

class TCP(object): 

    def __init__(self, ip, port): 
     self._ip = ip 
     self._port = port 
     self.socket = socket.socket() #Here is the change 
     self.socket.connect((ip, port)) 

    def send_data(self, data): 
     message = convert_data(data) 
     return self.socket.sendall(message) 

希望它帮助!

相关问题