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

Но вам также необходимо отправить данные, соответствующие этой структуре.

Другие вопросы по тегам