0
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:send(S1,term_to_binary("1"))。输出 <<131,107,0,1,49>>
gen_tcp:send(S1,term_to_binary(a))。输出 <<131,100,0,1,97>>
gen_tcp:send(S1,term_to_binary("abcd"))。输出 <<131,107,0,4,97,98,99,100>>
gen_tcp:send(S1,term_to_binary(1))。输出 <<131,97,1>>

我的问题是:
1. <<131,107>> 是什么?
2. 发送 1 而不是 "1" 得到的二进制没有包长度,比如 '131,107,0,1',为什么?

4

2 回答 2

1

当您使用 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" >>)

反而

于 2012-10-02T05:58:43.450 回答
0

我使用 term_to_binary 进行编码,但不使用 binary_to_term 进行解码。

于 2012-10-02T02:13:08.837 回答