非阻塞ruby UNIXSocket

时间:2012-11-30 22:24:02

标签: ruby sockets eventmachine celluloid

序言:显然,我太傻了。

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

由于默认UNIXSocket阻止了所有进一步的连接,我尝试使用EventMachine和Celluloid:

EventMachine的: 多个连接的工作方式类似于魅力,但无法访问客户端的UID。此外,即使您可以设置客户端超时,文档也不会告诉您何时实际触发此操作。对此体验特别令人沮丧:EventMachine上的某些方法(如get_peername)未在任何googleable API文档中记录,因为它们隐藏在原生扩展中。不幸的是,即使在C-Code中,EventMachine中也没有getpeereid的等价物,所以我最终对此表示赞同。

赛璐珞:我打开了一个普通的UNIXSocket,然后将任何打开的连接传递给async赛璐珞监听器。这也保持接受连接,但当我尝试结束服务器进程时,Celluloid线程无法关闭(Terminating X actors),即使我在内部正确socket.closeActor.current.terminate我的listen方法(通过async.listen调用)。唯一能解决这个问题的是kill -9。因为赛璐珞的文档告诉了我,我也尝试了celluloid-io echo server example,但这给了我同样的结果,需要kill -9

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

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

0 个答案:

没有答案