2012-10-02 93 views
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:recv收到的二进制文件是什么?

调用gen_tcp:发送(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.什么是< < 131107 >>?
2.发送1而不是“1”,并获得没有包长度的二进制,如“131,107,0,1”,为什么?

回答

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" >>) 

代替

+0

谢谢你的参考。我会深入阅读。 – goofansu

+0

哦,是的,它表示:“分布在跨节点边界发送消息时隐式地做到了这一点。” – goofansu

0

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

相关问题