【问题标题】:receive from a socket and also from another Erlang process从套接字和另一个 Erlang 进程接收
【发布时间】:2011-01-18 01:12:50
【问题描述】:

在 Erlang 进程中,我如何从 ssl 套接字接收,同时使用接收原语从另一个 erlang 进程接收?

这个想法是将来自套接字的内容转发到另一个进程;和倒退。

到目前为止,我唯一的选择是使用一些时间从每一端接收,然后切换。当然,这会延迟在一个接口上接收到的消息的处理,同时从另一个接口接收消息。你有没有其他方法可以做到这一点?如果只有 Erlang 能让我使用一个进程从套接字接收,另一个进程发送到套接字......

【问题讨论】:

  • 为什么感觉不能通过不同的流程发送和接收?
  • 你只是不能从一个套接字接收并从另一个进程发送到同一个套接字。如果您尝试从不拥有套接字的进程发送,则会收到错误消息。有一个功能可以更改套接字的所有权(ssl:controlling_process/2),但我认为一直切换并不是一个好主意。
  • 看来您实际上可以从不同的进程发送到套接字,但不能同时在另一个进程上接收。至少如果您使用 ssl:recv() 接收。

标签: sockets erlang


【解决方案1】:

无论如何,您将通过receive 语句在进程中从(例如)HTTP_Client 接收消息。您将能够轻松地描述“对话”:

{http, {RequestId, Result}} 用于 HTTP_Client“对话”

更多详情请见here

【讨论】:

    【解决方案2】:

    不确定我是否理解您的问题;无论如何,您可以在接收语句中包含多个“子句”,因此当从任一方接收某些内容时它会变得“畅通无阻”:

    loop() ->
      receive
        {ssl, Msg} ->  % incoming msg from SSL, send it to process
          Proc ! Msg,
          loop();
        {proc, Msg} -> % incoming msg from process, send it to SSL
          SSL ! Msg,
          loop()
      end.
    

    重要的是,您需要以一种可以区分 SSL 和使用模式匹配处理消息的方式来格式化您的消息。

    【讨论】:

    • 这正是我想做的。问题在于如何从 ssl 套接字接收数据,因为它是一个 erlang 消息。现在我正在使用 ssl:recv 从套接字接收,而不是使用接收原语。是否可以使用接收原语从套接字接收?
    • 当套接字处于活动状态时,我认为这是默认设置。
    • 你是对的,Zed,谢谢。只有 2 个细节:我不知道我必须使用 ssl:setopts(Socket, [{active, true}]) 将套接字设置为活动。此外,该模式更像 {ssl, Ssl_info, Msg}。再次感谢。
    猜你喜欢
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多