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

Erlang网络编程TCP和UDP消息v数据包,tcp,network-programming,erlang,udp,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 {sto

考虑以下几点:

  {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是否同样正确

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

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


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

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

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


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

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

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


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

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

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

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