代码之家  ›  专栏  ›  技术社区  ›  polerto

如何使用Python epoll获取服务器中连接的客户端列表

  •  0
  • polerto  · 技术社区  · 12 年前

    我想向连接到使用Python epoll的服务器的客户端子集发送一条消息。有没有一种实用的方法可以得到 fileno 的连接客户端?

    1 回复  |  直到 12 年前
        1
  •  1
  •   abarnert    12 年前

    通常情况下,您处理此问题的方法是自己跟踪客户。每次接受新客户端时,在将其添加到 epoll ,也可以将其添加到您的收藏中。每次删除客户端时,都要将其从集合中删除。

    典型的最小存储量是 dict 将套接字映射到需要跟踪的任何其他对象。您可以使用 socket 本身,a weakref 或其 fileno 作为关键。您需要的数据通常包括读取缓冲区和写入缓冲区、对等地址(在 accept ),名称或用户ID或身份验证cookie等。

    而且我不确定您是如何使用一个轮询服务器做任何有用的事情的,该服务器至少没有连接到每个客户端套接字的读取缓冲区。当你收到部分信息时,你会怎么做?(就这一点而言,如果您计划向这些客户端发送消息,但您没有写缓冲区,您将如何做到这一点?)


    但要回答您的具体问题:

    没有办法从Python中获得fd的列表 epoll object ,因为没有办法用 the underlying API .

    可以想象,您可以编写一些东西,逐步完成从0到最大打开fd的所有操作,并尝试 epoll_ctl 并根据误差进行区分。这可能是一个非常糟糕的主意,但也可能并非不可能。你可能不得不 ctypes 一直到本机功能,您可能需要考虑不同的可能性,以找出正确的效果。例如,如果你这样做了 epoll_ctl(my_epoll.fileno(), EPOLL_CTL_MOD, fd, NULL) ,你会得到 ENOENT 对于未注册的fd, EBADF 对于一个不存在的fd,但是 EINVAL (因为NULL event )对于有效的fd。或者它会断开。我不能保证有任何参数组合可以区分,但经过一些尝试和错误,你可能会找到一个。

    (顺便说一句,没有什么能说明 环氧树脂 必须是已连接客户端的列表;例如,它可能是连接的客户端加上侦听器套接字加上“退出”管道。)