2012-08-27 52 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