gpt4 book ai didi

sockets - 中断 gen_tcp :recv in erlang

转载 作者:行者123 更新时间:2023-12-02 12:11:05 26 4
gpt4 key购买 nike

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

套接字池进程监视所有借用套接字的进程。如果任何借用的进程已关闭,它会从中收到一个关闭信号:

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

在这种情况下,我们希望耗尽借用的套接字,并通过放回池中来重用它。问题是,当尝试使用 gen_tcp:recv(Socket, 0, 0) 耗尽套接字时,我们收到 inet already 错误消息,这意味着 recv 操作正在进行中。

所以问题是如何中断之前的recv,成功耗尽套接字,并重用于其他进程。

谢谢。

最佳答案

多一层间接将大大简化情况。

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

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

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

关于sockets - 中断 gen_tcp :recv in erlang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34076562/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com