Erlang网络编程TCP和UDP消息v包

时间:2015-02-07 11:00:14

标签: tcp network-programming erlang udp

请考虑以下事项:

  {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?

1 个答案:

答案 0 :(得分:3)

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

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

这些语句对于UDP也是如此,但鉴于UDP数据包可以被丢弃或无序到达,除非应用程序保证整个消息始终适合网络数据包,否则它不会有用。