2012-08-27 3 views
0

나는 {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. 

을의하지만 내가하려고하면 어떤 바이너리 명령을 사용하여 수신해야 gen_tcp 소켓을 사용하여 다음과 같은 코드가 있습니다

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">을 받았습니까

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

코드에서이 같은 될 것입니다 >''<<"hello">>을 보냈습니까? –

+0

ops, nope ... 지금 질문에 수정됩니다 – user601836

답변

2

귀하의 receive 절은 제대로 보이지 않습니다, 그것은해야한다 :

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

이제 작동합니다! :) 고마워요! – user601836

+0

미래를 위해, 내가 ssl로 바뀌면 << Message : 5/binary >>가 여전히 좋을까요? 그냥 물어보십시오 :) – user601836

+0

프로토콜 아톰은'tsc' 대신'ssl'이 될 것입니다. 당신은 괜찮을 것입니다. – johlo

0

내가 이해하는 한, gen_tcp:recv 기능이 필요합니다. 문서에서 :

... 
{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 소켓에서 데이터를받는 표준 방법이 아닙니다 (이것은'spawned' 프로세스로 작업하기위한 일반적인 인터페이스입니다). 당신은 어떤 이점을 얻을 것입니까? –

+0

AFAIK gen_tcp : recv/2가 차단 중입니다. 또한 향후 구현에서 나는 gen_server 동작의 handle_info에서 {active, once}로 패킷을 처리 할 것입니다. – user601836