1

序言:显然,我太愚蠢了。

我想UNIXSocket在 Ruby 中公开一个简单的命令,它接受来自连接客户端的单个命令,而不会在处理时阻塞进一步的连接,直到套接字关闭(STDLIB 套接字会这样做),包括在 X 秒内不发送任何命令的客户端超时。我还想要的是Etc.getpwuid(socket.getpeereid.first).name,或者:获取连接到该套接字的用户的用户名。

因为默认UNIXSocket阻止了所有进一步的连接,所以我尝试使用 EventMachine 和赛璐珞来做到这一点:

EventMachine: 多个连接就像一个魅力,但没有办法访问客户端的UID. 此外,即使您可以设置客户端超时,文档也没有说明何时实际触发。这种体验特别令人沮丧:EventMachine(like get_peername) 上的某些方法没有记录在任何 googleable API 文档中,因为它们隐藏在本机扩展中。getpeereid不幸的是,即使在 C 代码中,EventMachine 中也没有等价物,所以我最终放弃了这一点。

赛璐珞:我打开了一个常规的 UNIXSocket,然后将所有打开的连接传递给async赛璐珞监听器。这也一直在接受连接,但是当我尝试结束服务器进程时,赛璐珞线程无法关闭( ) ,Terminating X actors即使我在我的方法(称为 via )中做得正确。唯一能弥补这一点的是。因为赛璐珞的文档告诉我,我也尝试了回声服务器示例,但这给了我需要的相同结果。socket.closeActor.current.terminatelistenasync.listenkill -9celluloid-iokill -9

我一直在考虑启动我自己的处理程序线程解决方案,但这些解决方案缺少自动超时,我希望有人已经解决了这个看似基本的问题。

我希望我在这里遗漏了一些东西。到目前为止,我的印象是 Ruby 上的 Unix 套接字缺少最基本的成分:/

4

0 回答 0