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

时间:2013-03-13 02:55:44

标签: python sockets client server-side epoll

我想向连接到使用Python epoll的服务器的客户端子集发送消息。是否有实用的方法来获取fileno的连接客户列表?

1 个答案:

答案 0 :(得分:1)

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

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

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


但要回答你的具体问题:

无法从Python epoll object获取fd列表,因为无法使用the underlying API执行此操作。

可以想象,您可以编写一些内容,逐步完成从0到最大打开fd的所有内容,并尝试使用它来epoll_ctl并根据错误进行区分。这可能是一个非常糟糕的主意,但这可能并非不可能。您可能需要ctypes到本机功能,并且您可能需要使用不同的可能性来找出具有正确效果的内容。例如,如果您执行epoll_ctl(my_epoll.fileno(), EPOLL_CTL_MOD, fd, NULL),则对于未注册的fd,您将获得ENOENT,对于不存在的fd,您将获得EBADF,但是EINVAL(因为NULL {{ 1}})对于有效的fd。或者它可能是段错误。我不能保证有任何参数组合可以区分,但有一些试验和错误,你可能会找到一个。

(顺便说一下,没有任何内容表明event必须是已连接客户端的列表;例如,它可能是连接的客户端加上侦听器套接字加上“退出”管道。)