1

私はErlangが初めてで、基本的なサーバーを書いています。クライアントに関する情報 (Pid、Client_socket、および Client_name.

どんな提案も素晴らしく、大歓迎です。読んでくれてありがとう :)

これまでの私のコードは次のとおりです。

-module(cell_clnt).

-export([cell_client/0]).

cell_client()->
    %%% Add any needed parameters for your cell process here
    Port = 21,
    Pending_connections = 5,
    Cell = fun()-> cell_process() end,
    spawn(fun()-> timer:sleep(10), keyboard_loop(Cell) end),
    receive
        stop->
            ok
    end.

keyboard_loop(Cell)->
    case io:get_line(">> ") of
        "quit\n"->
           io:fwrite("Exiting...~n"),
           if is_pid(Cell)-> Cell!stop; true->ok end;
        "start\n" when is_function(Cell)->
            keyboard_loop(spawn(Cell));
        Input when is_pid(Cell)->
            Cell!{input,Input},
            keyboard_loop(Cell);
        _Input->
            io:fwrite("No cell process active yet!~n"),
            keyboard_loop(Cell)
    end.


%%% Edit this to implement your cell process %%%
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, Clients)->
    io:format("Clients: ~p", [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),
        Pid = spawn(fun()-> client_loop(Client_socket) end),
            loop(Listening_socket,[{Pid,Client_socket,Name}|Clients])
        end.    

client_loop(Client_socket)->    
    case gen_tcp:recv(Client_socket,0) of
    {ok,Message}-> gen_tcp:send(Client_socket,Message),
        client_loop(Client_socket);

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

2 に答える 2

1

次のように、pid を強制終了することでソケットを閉じることができます。

erlang:exit(Pid, kill)
于 2013-08-10T00:36:44.157 に答える
1

TCP ソケットを閉じてプロセスを強制終了する必要がある場合に使用します。

gen_tcp:close(Socket)
exit(Pid, kill).
于 2013-08-10T07:29:50.417 に答える