Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -module(interface_server2).
- -behaviour(gen_server).
- -compile(export_all).
- -record(interface_state, {port, lsock, buffer}).
- process_data([13,10], State) ->
- exec_call(State),
- New_state = State#interface_state{buffer = []},
- New_state;
- process_data(RawData, State) ->
- Buffer = State#interface_state.buffer,
- New_state = State#interface_state{buffer = Buffer ++ RawData},
- New_state.
- args_to_terms(RawArgs) ->
- {ok, Toks, _Line} = erl_scan:string("[" ++ RawArgs ++ "]. ", 1),
- {ok, Args} = erl_parse:parse_term(Toks),
- Args.
- exec_call(State) ->
- Socket = State#interface_state.lsock,
- Buffer = State#interface_state.buffer,
- {match, [XMod, XFun, XArgs]} = re:run(Buffer, "^([^\s]+):([^\s]+)\\(\s*(.*)\s*\\)$", [{capture, [1, 2, 3], list}]),
- Mod = list_to_atom(XMod),
- Fun = list_to_atom(XFun),
- Args = args_to_terms(XArgs),
- io:format("~p:~p~w~n", [Mod, Fun, Args]),
- Result = apply(Mod, Fun, Args),
- gen_tcp:send(Socket, io_lib:fwrite("~p~n", [Result])),
- io:format("~w~n", [Result]).
- start_link(Port) -> gen_server:start_link({local, ?MODULE}, ?MODULE, [Port], []).
- init([Port]) ->
- {ok, LSock} = gen_tcp:listen(Port, [{active, true}]),
- {ok, #interface_state{port = Port, lsock = LSock, buffer=[]}, 0}.
- handle_info({tcp, _Socket, RawData}, State) ->
- New_state = process_data(RawData, State),
- {noreply, New_state};
- handle_info(timeout, #interface_state{lsock = LSock} = State) ->
- {ok, _Sock} = gen_tcp:accept(LSock),
- {noreply, State}.
- handle_cast(stop, State) -> {stop, normal, State}.
- %handle_call(_Request, _From, State) -> {reply, Reply, State}.
- %handle_cast(_Msg, State) -> {noreply, State}.
- %handle_info(_Info, State) -> {noreply, State}.
- terminate(_Reason, _State) -> ok.
- code_change(_OldVsn, State, _Extra) -> {ok, State}.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement