首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二郎中断gen_tcp:recv

二郎中断gen_tcp:recv
EN

Stack Overflow用户
提问于 2015-12-03 21:32:02
回答 1查看 234关注 0票数 3

我们有一个gen_server进程,它通过创建被动套接字池并为其他进程借用它们来管理客户端的被动套接字池。任何其他进程都可以借用套接字,使用套接字向服务器发送请求,通过gen_tcp:recv获得答复,然后将套接字释放到gen_server套接字池进程。

套接字池进程监视借用套接字的所有进程。如果借来的进程有任何故障,则从它得到一个下行信号:

handle_info({'DOWN', Ref, process, _Pid, _Reason}, State) ->

在这种情况下,我们想要排出借来的套接字,并将其放回池中进行重用。问题是,在尝试使用gen_tcp:recv(Socket, 0, 0)导出套接字时,我们得到了inet错误消息,这意味着recv操作正在进行中。

因此,问题是如何中断以前的recv,成功地释放套接字,并为其他进程重用。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-03 23:31:05

再往前走一步,情况就会大大简化。

不要将套接字传递给需要使用套接字的进程,而是让每个套接字由拥有套接字的单独进程控制,并表示系统内的套接字。根据需要将Erlang端消息路由到套接字和套接字之间,以实现套接字的“借用”(更灵活地,为套接字控制器传递一个讲给定协议的回调模块,因此一旦数据通过网络,它就会在内部被解释为Erlang消息)。

如果这样做了,您就不会失去对套接字的控制,或者让它们处于不确定的状态--相反,它们将一直由一个单独的拥有过程持有。不要让路由管理器/池管理器进程接收'DOWN'消息,而是让套接字控制器监视其当前的使用过程。当接收到一个'DOWN'时,您可以根据需要更改状态。

在某些奇怪的情况下,您可以在没有指定为套接字所有者的套接字之间传递打开的文件描述符、套接字和其他类型的端口。如果您需要跨几个节点扩展一个程序(突然之间,您必须关心在哪里传递以及它们在哪个节点上,等等),那么传递端口和套接字也会成为一个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34076562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档