Erlang gen_tcp накапливает полученные данные
Это мой код для получения данных
-module(t).
-compile(export_all).
start() ->
{ok, LSock} = gen_tcp:listen(5555, [binary, {packet, 0},
{active, false}]),
{ok, Sock} = gen_tcp:accept(LSock),
{ok, Bin} = do_recv(Sock, []),
ok = gen_tcp:close(Sock),
Bin.
do_recv(Sock, Bs) ->
io:format("(="), io:format(Bs),io:format("=)~n"),
case gen_tcp:recv(Sock, 0) of
{ok, B} ->
do_recv(Sock, [Bs, B]);
{error, closed} ->
{ok, list_to_binary(Bs)}
end.
я посылаю в сокет последовательно - 1, потом 2, потом 3, потом 4, потом 5
код накапливает полученные данные
это печать на экран
(=12345=)
как изменить код для напечатанного кода
(=1=)
(=2=)
(=3=)
(=4=)
(=5=)
эти данные не накапливаются
1 ответ
TCP представляет данные в виде потока без структуры сообщения. Это не имеет ничего общего с реализацией Эрланга.
Если вам нужна структура сообщения, вы должны закодировать ее в полосе в потоке данных.
Erlang помогает вам с простой встроенной структурой пакетов с длиной 1, 2 или 4 байта, за которой следуют данные. Это то, что {packet N}
делает для N равным 1,2 или 4
Но вам также необходимо отправить данные, соответствующие этой структуре.