请考虑以下事项:
{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
(发送乐趣关闭套接字)。
答案 0 :(得分:3)
当您为接收方指定{packet, N}
时,它意味着发送方包含一个4字节的big-endian标头,指示数据包的长度。 Erlang运行时读取该标头,从一个或多个网络数据包组装该大小的消息,对于活动模式套接字,将其发送到控制进程。标题不是消息的一部分。
如果指定{packet, 4}
,则邮件大小限制为2GB(是,2,而不是4;请参阅the documentation)。这样的消息不会溢出任何套接字缓冲区,因为消息是从通常较小的底层网络数据包组装的。但对于给定的应用程序来说,它可能太大了,例如内存受限的嵌入式系统,在这种情况下,可能会使用{packet, 2}
作为协议。
这些语句对于UDP也是如此,但鉴于UDP数据包可以被丢弃或无序到达,除非应用程序保证整个消息始终适合网络数据包,否则它不会有用。