【问题标题】:Erlang network programming TCP and UDP messages v packetsErlang 网络编程 TCP 和 UDP 消息 v 数据包
【发布时间】:2015-04-07 12:19:51
【问题描述】:

考虑以下几点:

  {ok, ListenSocket} = gen_tcp:listen(Port, [binary, {packet, 4}, {reuseaddr, true}, {active, once} ]),
  {ok, AcceptSocket} = gen_tcp:accept(ListenSocket),
  receive
    {tcp, Socket, Bin} ->
      case binary_to_term(Bin) of
        {store, Value} ->
          Uid = kvstore:store(Value),
          send(Socket,Uid);
        {retrieve, Key} ->
          send(Socket,kvstore:retrieve(Key))
      end
  end

(发送乐趣关闭套接字)。

  • 我假设 EVM 负责重构构成消息的 n 个数据包而不是用户代码?
  • 在什么情况下,一个非常大的消息可能会溢出套接字缓冲区?
  • 这些陈述是否同样适用于 UDP?

【问题讨论】:

    标签: tcp network-programming erlang udp


    【解决方案1】:

    当您为接收者指定{packet, N} 时,这意味着发送者包含一个 4 字节的 big-endian 标头,指示数据包的长度。 Erlang 运行时读取该标头,从一个或多个网络数据包中组装该大小的消息,然后对于活动模式套接字,将其发送到控制进程。标头不是消息的一部分。

    如果您指定 {packet, 4},则消息大小限制为 2GB(是的,2,而不是 4;请参阅 the documentation)。这样的消息不会溢出任何套接字缓冲区,因为该消息是从通常较小的底层网络数据包组装而成的。但它对于给定的应用程序(例如内存受限的嵌入式系统)可能太大了,在这种情况下,可能会使用{packet, 2} 作为协议。

    这些陈述也适用于 UDP,但鉴于 UDP 数据包可能会被丢弃或乱序到达,除非应用程序保证整个消息始终适合网络数据包,否则它就没有那么有用了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 2013-07-01
      • 2012-04-10
      • 2015-03-31
      • 2011-07-06
      • 1970-01-01
      相关资源
      最近更新 更多