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 回答