2011-11-23 4 views
2

.NET TCP Sender를 Erlang 수신기에 전송했습니다. localhost을 해결할 때 .NET 구성 요소는 IPv6 주소 ::1을 사용하는 것을 좋아합니다. Erlang이 gen_tcp를 사용하여 IPv6 주소를 수신하는 방법을 잘 모르겠습니다. 여기 내 시도가있다. 듣기에 잘못된 소켓을 말하고 있습니까? 감사!Erlang gen_tcp : IPv6에 대해/2를 청취합니다.

listen(Config) -> 
    PortString = Config#cfg.eventbusport, 
    GoodPort = check_int(PortString), 
    Port = if GoodPort -> 
       list_to_integer(PortString); 
      true -> 
       ?DEFAULT_PORT 
      end,      %% IPv6 here ---> 
    {ok, XSocket} = gen_tcp:listen(Port, [binary, {packet, line}, {active, false}, {reuseaddr, true}, inet6, {ip, {0,0,0,0,0,0,0,1}}]) 
    end, 
    accept(XSocket, Config). 

accept(LSocket, Config) -> 
    case gen_tcp:accept(LSocket) of 
     {ok, Socket} -> 
      spawn_link(fun() -> loop(Socket, Config) end), 
      accept(LSocket, Config); 
     {error, closed} -> 
      logger("Accept: Closed socket.",[],1), 
      listen(Config) 
    end. 

loop(Socket, Config) -> 
    case inet:setopts(Socket, [{recbuf, 64000}]) of 
     ok -> 
      case gen_tcp:recv(Socket, 0) of 
       {ok, Data} -> 
        SplitData = binary:split(Data,?CRLF,[global]), 
        discrim(SplitData, Config), 
        loop(Socket, Config); 
       {error, closed} -> 
        logger("Loop: Closed socket.",[],1), 
        ok 
      end; 
     {error, Reason} -> 
      logger("ERROR: Couldn't set the recbuf to 64k! Because ~p",[Reason],1) 
    end. 
+1

정확히 여기에 어떤 문제가 있습니까? 오류 메시지가 표시되거나 시간 초과 또는 어떤 오류가 발생합니까? – dijxtra

+0

* 업데이트 * : 내가 겪고있는 문제는 결코 연결되지 않는다는 것입니다. 내 C# 보낸 사람이 연결할 수 없으므로 데이터를 보내지 않습니다. 소켓 1971에 대한 Address :: 1 수신 대기중인 것은 아무것도 없다고 말합니다. – batman

답변

1

실제 문제는 무엇입니까?

연결을 사용하기 위해 스폰 프로세스에서 소켓의 제어 프로세스를 설정해야합니다. 그래서 accept/2 당신이 좋아하는 일을 할 것입니다에서 다음 루프를 받아 작성

accept(LSocket, Config) -> 
    case gen_tcp:accept(LSocket) of 
     {ok, Socket} -> 
      Pid = spawn_link(fun() -> loop(Socket, Config) end), 
      gen_tcp:controlling_process(Socket, Pid), 
      accept(LSocket, Config); 
... 

또 다른 방법은 너무 대신 새로운 동의 루프를 생성한다. 다음과 같은 메시지가 표시됩니다.

accept_loop(LSocket, Config) -> 
    {ok,Socket} = gen_tcp:accept(LSocket), 
    spawn_link(fun() -> accept_loop(LSocket, Config) end), 
    loop(Socket, Config). 

오류 처리 기능을 사용하지 않습니다. 청취 소켓을 문제없이 다른 프로세스에 전달할 수 있습니다. 물론 청취 소켓을 연 프로세스가 종료되면 소켓이 닫힙니다.

+0

제어 프로세스를 설정할 필요성을 발견하지 못했습니다. 소켓 수신 후 닫히면 대개 수신 루프에서 닫히기 때문에 (적어도 이 디자인),하지만 어쨌든 나는 바꿀지도 모른다. 원래 질문에 대한 내 의견을 참조하십시오. – batman

관련 문제