我想向连接到使用 Python epoll 的服务器的客户端子集发送消息。是否有获取fileno
已连接客户端列表的实用方法?
1 回答
通常,您处理此问题的方式是自己跟踪客户。每次您接受新客户时,在将其添加到 之前epoll
,还要将其添加到您的收藏中。每次您删除客户时,将其从您的收藏中删除。
典型的最小存储是dict
将套接字映射到您需要跟踪的任何其他内容。您可以使用它socket
本身、weakref
它的a 或它fileno
作为键。您需要的数据通常包括读取缓冲区和写入缓冲区、对等地址(在 上接收accept
)、名称或用户 ID 或身份验证 cookie 等。
而且我不确定您如何使用轮询服务器做任何有用的事情,该服务器至少没有连接到每个客户端套接字的读取缓冲区。当您收到部分消息时,您会怎么做?(就此而言,如果您打算向这些客户端发送消息,并且您没有写缓冲区,您将如何做?)
但要回答您的具体问题:
无法从 Pythonepoll
对象中获取 fd 的列表,因为无法使用底层 API来执行此操作。
可以想象,您可以编写从 0 到最大打开 fd 的所有内容,并尝试对其进行epoll_ctl
处理并根据错误进行区分。这可能是一个非常糟糕的主意,但也并非不可能。您可能不得不使用ctypes
本机功能,并且您可能需要尝试不同的可能性以找出具有正确效果的方法。例如,如果你这样做epoll_ctl(my_epoll.fileno(), EPOLL_CTL_MOD, fd, NULL)
,你会得到ENOENT
一个未注册的 fd,EBADF
一个不存在的 fd,但是EINVAL
(因为 NULL event
)一个有效的 fd。或者它可能会出现段错误。我不能保证有任何参数组合可以区分,但是通过一些试验和错误,你可能会找到一个。
(顺便说一句,没有什么说 anepoll
必须是已连接客户端的列表;例如,它可能是已连接的客户端加上侦听器套接字加上“退出”管道。)