2012-08-27 51 views
0

我具有使用调用gen_tcp插座,它应该接收使用{active, true},它们总是大小5(例如Command = <<"hello">>接收来自调用gen_tcp套接字数据的特定量

{ok, ListenSocket} = gen_tcp:listen(5555, [{active, true}, {mode, binary}, 
              {packet, 0}]), 
{ok, Socket} = gen_tcp:accept(ListenSocket),  
loop(). 

receive() -> 
    {tcp, _Socket, Message:4/binary} -> 
     io:format("Success~n", []), 
     loop(); 
    {tcp, _Socket, Other} -> 
     io:format("Received: ~p~n", [Other]), 
     loop() 
end. 

的但是,如果我尝试一些二进制命令下面的代码连接作为这样的客户端:

1> {ok, S} = gen_tcp:connect("localhost", 5555, []). 
    {ok,#Port<0.582>} 
2> gen_tcp:send(S, <<"hello">>). 
ok 

我在接收部:

Received: {tcp,#Port<0.585>,<<"hello">>} 

所以我想我的错误是在模式匹配...但在哪里?

+0

你收到'<<"ciao"> ''当你发送'<<"hello">>'? –

+0

ops,nope ...现在将在问题中修复 – user601836

回答

2

receive条款看起来不正确的,它应该是:

{tcp, _Socket, <<Message:5/binary>>} -> 
    .... 
+0

现在它正在工作! :) 非常感谢! – user601836

+0

为未来,如果我更改为SSL将<<消息:5 /二进制>>仍然好?只是问:) – user601836

+0

协议原子将是'ssl'而不是'tcp',除此之外,你应该没问题 – johlo

0

据我了解,你需要gen_tcp:recv函数。从技术文档:

recv(Socket, Length) -> {ok, Packet} | {error, Reason} 

在您的代码将是这样的:

... 
{ok, Socket} = gen_tcp:accept(ListenSocket), 
loop(Socket). 

loop(Socket) -> 
    case gen_tcp:recv(Socket, 5) of 
     {ok, Data} -> 
      io:format("Success~n", []), 
      loop(Socket); 
     {error, closed} -> 
      ok 
end. 
+0

是的,我知道这个选项,但是不可能使用标准接收吗?我宁愿以这种方式处理它。 – user601836

+0

'receive'不是从TCP套接字接收数据的标准方式(这是用于处理'产生的'进程的通用接口)。你会得到什么好处? –

+0

AFAIK gen_tcp:recv/2正在阻塞。此外,在未来的实现中,我将在gen_server行为的handle_info中处理{active,once}的数据包。 – user601836