Какой двоичный файл получил gen_tcp:recv?

loop(Socket) ->
    case gen_tcp:recv(Socket, 0) of
        {ok, Bin} ->
            io:format("Bin=~p~n", [Bin]),
            loop(Socket);
        {error, Reason} ->
            io:format("Reason=~p~n", [Reason])
    end.

{env, [
    {tcp_listen_options, [binary, {active, false}, {packet, 0}, {reuseaddr, true}, {backlog, 256}]},
    {port, 5678}
]}

Установил ли я packet 0 или 1, 2, 4, всегда получайте следующее:

gen_tcp: отправить (S1,term_to_binary("1")). выход << 131,107,0,1,49 >>
gen_tcp: отправить (S1, term_to_binary (а)). выход << 131,100,0,1,97 >>
gen_tcp: отправить (S1, term_to_binary ("ABCD")). выход << 131,107,0,4,97,98,99,100 >>
gen_tcp: отправить (S1,term_to_binary(1)). выход << 131,97,1 >>

Мои вопросы:
1. Что такое << 131,107 >>?
2. Отправьте 1 вместо "1" и получите двоичный файл без длины пакета, такой как "131,107,0,1", почему?

2 ответа

Решение

Когда вы используете term_to_binary, вы конвертируете свое значение erlang во внешний формат термина. 131 заголовок для этого формата. 107 означает "следующие байты являются строкой". Вы можете прочитать это здесь: http://www.erlang.org/doc/apps/erts/erl_ext_dist.html

Я считаю, что вам не нужно term_to_binary здесь. Вы могли бы использовать

gen_tcp:send(S1,<< "abcd" >>)

вместо

Я использую term_to_binary для кодирования, но не использую binary_to_term для декодирования.

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