diff options
author | Joe Zhao <ztuowen@gmail.com> | 2014-06-07 15:22:55 +0800 |
---|---|---|
committer | Joe Zhao <ztuowen@gmail.com> | 2014-06-07 15:22:55 +0800 |
commit | 6b768801841204ad2a173470201dbcc98bbd9aa6 (patch) | |
tree | c8320296ab0b4d6153356ab9cf8f88884c3d1e10 | |
parent | 08f1509b9b854fe49dc832c3d5a16d75c2b55002 (diff) | |
download | local-6b768801841204ad2a173470201dbcc98bbd9aa6.tar.gz local-6b768801841204ad2a173470201dbcc98bbd9aa6.tar.bz2 local-6b768801841204ad2a173470201dbcc98bbd9aa6.zip |
Passive tcp server
-rw-r--r-- | tcpserv.erl | 51 |
1 files changed, 21 insertions, 30 deletions
diff --git a/tcpserv.erl b/tcpserv.erl index 808bcba..d76dcb8 100644 --- a/tcpserv.erl +++ b/tcpserv.erl @@ -13,62 +13,54 @@ -compile([debug_info,export_all]). --define(TCP_OPTIONS,[list, {packet, 1}, {active, false}]). +-define(TCP_OPTIONS,[list, {packet, 1}, {active, true}]). -define(DLYTIME,1000). %% API %%-export([]). lsockinit() -> ok. -do_send(Sock,Pid,From) -> +do_loop(Sock,Pid,N) -> receive - {From,exiting} -> ok; - {Pid,shutdown} -> - gen_tcp:close(Sock), + {tcp,Sock,Data} -> + io:format("~p:\n ~p\n",[N,Data]), + manip_msg(Pid,Data), + do_loop(Sock,Pid,N+1); + {tcp_closed,Sock} -> ok; + {Pid,shutdown} -> + gen_tcp:close(Sock); {_PPid,comm,Msg} -> gen_tcp:send(Sock,Msg), - do_send(Sock,Pid,From) - end. - -do_recv(Sock,Pid,To,Cnt) -> - case gen_tcp:recv(Sock,0) of - {ok, B} -> - io:format("~p:\n ~p\n",[Cnt,B]), - manip_msg(Pid,To,B), - %% devicemon ! {self(),comm,Msg}, - do_recv(Sock,Pid,To,Cnt+1); - {error, closed} -> - ok + do_loop(Sock,Pid,N) end. %% Message manipulation & dispatch routine -manip_msg(Pid,To,[0,0,Addr,MsgReq,MsgRes|Name]) -> +manip_msg(_Pid,[0,0,Addr,MsgReq,MsgRes|Name]) -> %% Operation command dispatch -> Complex(devicemon + Message handler) - cmdiface:reg_feedbackOps(Addr,Name,?DLYTIME,[MsgReq],[MsgRes],To); -manip_msg(Pid,To,[0|Tail]) -> + cmdiface:reg_feedbackOps(Addr,Name,?DLYTIME,[MsgReq],[MsgRes],self()); +manip_msg(_Pid,[0|Tail]) -> %% Seperation from the next part - devicemon ! {To,comm,[0|Tail]}; -manip_msg(Pid,To,[Addr,Cmd|Name]) when Addr<10 -> + devicemon ! {self(),comm,[0|Tail]}; +manip_msg(_Pid,[Addr,Cmd|Name]) when Addr<10 -> %% Seperation from the next part cmdiface:invoke_cmd(Addr,Name,[Cmd]); -manip_msg(Pid,To,Msg) -> % This needs improvements +manip_msg(Pid,Msg) -> % This needs improvements %% Fallback -> WTF Pid ! {self(),comm,Msg}. createsock(Sock,Pid) -> - To=spawn(?MODULE,do_send,[Sock,Pid,self()]), - Pid ! {self(),create,To}, - ok = do_recv(Sock,Pid,To,0), - To ! Pid ! {self(),exiting}. + Pid ! {self(),create,self()}, + ok = do_loop(Sock,Pid,0), + Pid ! {self(),exiting}. listenport(LSock,Pid) -> {ok,Sock} = gen_tcp:accept(LSock), - spawn(?MODULE,createsock,[Sock,Pid]), + gen_tcp:controlling_process(Sock,spawn(?MODULE,createsock,[Sock,Pid])), listenport(LSock,Pid). portlistener(Port,Pid) -> - {ok, LSock} = gen_tcp:listen(Port, [list, {packet, 1}, {active, false}]), + {ok, LSock} = gen_tcp:listen(Port, ?TCP_OPTIONS), listenport(LSock,Pid). @@ -94,7 +86,6 @@ tcpmon(Port) -> start(Port) -> spawn(?MODULE,tcpmon,[Port]). - trap() -> trap(). test() -> |