Erlang TCP Socket的接收进程的2种方案
轉(zhuǎn)自:http://blog.csdn.net/summerhust/article/details/8740973
?
一旦打開了一個使用TCP連接的套接字,它就始終保持打開狀態(tài),直至任何一方關(guān)閉它或因為一個錯誤而終止。在建立一個連接時,一般為每一次請求產(chǎn)生一個新進(jìn)程,只要有請求被處理,就保持這個進(jìn)程的存活。
假設(shè)有一個監(jiān)聽進(jìn)程,其任務(wù)是等待傳入的TCP請求。只要一個請求到達(dá),響應(yīng)該連接請求的進(jìn)程就變成了接收進(jìn)程,有2種方案:
1. 產(chǎn)生新的進(jìn)程并成為接收進(jìn)程,而監(jiān)聽者返回并繼續(xù)監(jiān)聽下一個新的連接請求:
server()?->??
????{ok,?ListenSocket}?=?gen_tcp:listen(1234,?[binary,?{active,?false}]),??
????wait_connect(ListenSocket,0).??
?wait_connect(ListenSocket,?Count)?->??
????{ok,?Socket}?=?gen_tcp:accept(ListenSocket),??
????Pid?=?spawn(?MODULE,?get_request,?[Socket,?[],?Count]),??
????%將該套接字的控制進(jìn)程改為Pid進(jìn)程??
????gen_tcp:controlling_process(Socket,?Pid),??
????wait_connect(ListenSocket,?Count+1).??
??????
??
get_request(Socket,?BinaryList,?Count)?->??
????case?gen_tcp:recv(Socket,?0,?5000)?of??
????{ok,?Binary}?->??
????????io:format("received?data:?~p~n",?[binary_to_list(Binary)]),??
????????get_request(Socket,?[Binary|BinaryList],?Count);??
????{error,?closed}?->??
????????handle(lists:reverse(BinaryList),?Count)??
????end.??
?
2. 使監(jiān)聽進(jìn)程成為接收進(jìn)程,并使產(chǎn)生的新進(jìn)程成為新的監(jiān)聽者:
?
server()?->??
????{ok,?ListenSocket}?=?gen_tcp:listen(1234,?[binary,?{active,?false}]),??
????wait_connect(ListenSocket,0).?
?
wait_connect(ListenSocket,?Count)?->??
????{ok,?Socket}?=?gen_tcp:accept(ListenSocket),??
????spawn(?MODULE,?wait_connect,?[ListenSocket,?Count+1]),??
????get_request(Socket,?[],?Count).??
?
說明:
(1)? 創(chuàng)建一個套接字的進(jìn)程(通過調(diào)用gen_tcp:accept或gen_tcp:connect)也就是該套接字的控制進(jìn)程,該套接字所收到的任何消息都會轉(zhuǎn)發(fā)給這個控制進(jìn)程,如果控制進(jìn)程消亡,那么該套接字也會自行關(guān)閉。我們可以通過gen_tcp:controlling_process(Socket, NewPid)函數(shù)來把一個套接字的控制進(jìn)程改為新的控制進(jìn)程NewPid;
(2) gen_tcp:accept和gen_tcp:recv是阻塞的,可以用prim_inet:async_accept和prim_inet:async_recv實現(xiàn)非阻塞。
總結(jié)
以上是生活随笔為你收集整理的Erlang TCP Socket的接收进程的2种方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 免费开通二级域名的论坛
- 下一篇: ATL WTL 实现分析(五)