Erlang

2013-08-07 3 views
1

의 목록에 클라이언트를 추가하므로 클라이언트가 연결할 수있는 기본 서버를 작성 중입니다. 텔넷으로 테스트 중이지만 문제는 클라이언트를 목록에 저장하는 방법입니다. 그러면 서버에 연결된 사람을 인쇄 할 수 있습니다. 클라이언트를 저장하는 목록에서 ++ 연산자를 사용해 보았지만 프로세스 오류가 계속 발생합니다. 어떤 도움이 많이 읽기, 감사 감사하겠습니다Erlang

cell_process()-> 
    io:fwrite("In cell~n"), 
    {ok,Listening_socket} = gen_tcp:listen(21, 
              [binary, 
              {backlog,5}, 
              {active,false}, 
              {packet,line}]), 
    loop(Listening_socket). 

loop(Listening_socket)-> 
    case gen_tcp:accept(Listening_socket) of 
     {ok,Client_socket} -> 

      gen_tcp:send(Client_socket, "Hello, what is your name?"), 
      {_,Name} = gen_tcp:recv(Client_socket,0), 
      gen_tcp:send(Client_socket, "Hello, "), 
      gen_tcp:send(Client_socket, Name), 
      io:fwrite([Name]), 
      spawn(fun()-> client_loop(Client_socket) end), 
      loop(Listening_socket); 

     {error,Why}->io:fwrite("Error: "), 
        io:fwrite([Why]) 
    end. 

client_loop(Client_socket)-> 
    case gen_tcp:recv(Client_socket,0) of 
     {ok,Message}-> gen_tcp:send(Client_socket,Message), 
         %% code not yet implemented here 
         client_loop(Client_socket); 

     {error,Why}-> io:fwrite("Error: ~s~n",[Why]), 
         gen_tcp:close(Client_socket) 
    end. 

:

여기에 지금까지 내 코드입니다.

답변

1

연결된 클라이언트의 추적을 유지하려면 루프 기능에 변수를 추가하고 제안 된대로 관련 정보를 클라이언트 목록에 저장해야합니다.

cell_process()-> 
    io:fwrite("In cell~n"), 
    {ok,Listening_socket} = gen_tcp:listen(21, 
              [binary, 
              {backlog,5}, 
              {active,false}, 
              {packet,line}]), 
    loop(Listening_socket,[]). %% initial Clients list is empty 

loop(Listening_socket,Clients)-> 
    case gen_tcp:accept(Listening_socket) of 
     {ok,Client_socket} -> 

      gen_tcp:send(Client_socket, "Hello, what is your name?"), 
      {_,Name} = gen_tcp:recv(Client_socket,0), 
      gen_tcp:send(Client_socket, "Hello, "), 
      gen_tcp:send(Client_socket, Name), 
      io:fwrite([Name]), 
      Pid = spawn(fun()-> client_loop(Client_socket) end), 
      loop(Listening_socket,[{Pid,Client_socket,Name}|Clients]); 

내 의견

 {error,Why}->io:fwrite("Error: "), 
        io:fwrite([Why]) 
    end. 

client_loop(Client_socket)-> 
    case gen_tcp:recv(Client_socket,0) of 
     {ok,Message}-> gen_tcp:send(Client_socket,Message), 
         %% code not yet implemented here 
         client_loop(Client_socket); 

     {error,Why}-> io:fwrite("Error: ~s~n",[Why]), 
         gen_tcp:close(Client_socket) 
    end. 

댓글 목록 에 새 클라이언트를 추가하지만 볼 %% : 그것은 클라이언트 목록을 저장 할 수있는 권리 장소가 아니다, 클라이언트를 관리해야하기 때문에 누가 링크 또는 모니터로 죽어 가고 있는지, 그래서 당신은 수신 블록을 필요로 소켓을 듣고 호환되지 않습니다. 그래서 나는이 목록을 관리하는 서버를 추가해야한다고 생각합니다. 새로운 클라이언트가 시작될 때마다 보내는 메시지를 듣고, 클라이언트를 모니터링하고, 클라이언트 목록을 알고 싶을 때 관리자에게 응답합니다.

+0

감사합니다. 내가 겪고있는 유일한 다른 문제는 쉘 목록에 클라이언트 목록을 출력하는 방법이다. 나는 io : fwrite를 시도했지만 프로세스가 충돌한다. – user2484294

+0

'io : 형식 ("클라이언트 : ~ p", [클라이언트 목록]). – Isac

1

여기 제안입니다 :

loop(Listening_socket, ClientList)-> 
    case gen_tcp:accept(Listening_socket) of 
     {ok,Client_socket} -> 
      gen_tcp:send(Client_socket, "Hello, what is your name?"), 
      {_,Name} = gen_tcp:recv(Client_socket,0), 
      gen_tcp:send(Client_socket, "Hello, "), 
      gen_tcp:send(Client_socket, Name), 
      io:fwrite([Name]), 
      spawn(fun()-> client_loop(Client_socket) end), 
      loop(Listening_socket, [Client_socket | ClientList]); 

     {error,Why}->io:fwrite("Error: "), 
        io:fwrite([Why]) 
    end. 

더 나은 솔루션 당신이 그 state와 루프 (이 경우, Listening_socket 및 ClientList에) 필요한 모든 바르를 저장 state 기록을 가지고하는 것입니다.