从服务器(Erlang)踢客户端

时间:2013-08-09 18:23:26

标签: networking functional-programming erlang

我是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.

2 个答案:

答案 0 :(得分:1)

您可以通过杀死pid来关闭套接字,如下所示:

erlang:exit(Pid, kill)

答案 1 :(得分:1)

当您需要关闭TCP套接字并终止进程时使用:

gen_tcp:close(Socket)
exit(Pid, kill).