Erlang TCP Socket監聽程序和接收程序
阿新 • • 發佈:2018-11-24
Erlang TCP Socket監聽程序和接收程序的說明
轉自:https://blog.csdn.net/summerhust/article/details/8740973
一旦打開了一個使用TCP連線的套接字,它就始終保持開啟狀態,直至任何一方關閉它或因為一個錯誤而終止。在建立一個連線時,一般為每一次請求產生一個新程序,只要有請求被處理,就保持這個程序的存活。
假設有一個監聽程序,其任務是等待傳入的TCP請求。只要一個請求到達,響應該連線請求的程序就變成了接收程序,如何把接收和監聽區分開來,有2種方案:
- 產生新的程序併成為接收程序,而監聽者返回並繼續監聽下一個新的連線請求:
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]), %將該套接字的控制程序改為Pid程序 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.
- 使監聽程序成為接收程序,並使產生的新程序成為新的監聽者:
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) 建立一個套接字的程序(通過呼叫gen_tcp:accept或gen_tcp:connect)也就是該套接字的控制程序,該套接字所收到的任何訊息都會轉發給這個控制程序,如果控制程序消亡,那麼該套接字也會自行關閉。我們可以通過gen_tcp:controlling_process(Socket, NewPid)函式來把一個套接字的控制程序改為新的控制程序NewPid;
(2) gen_tcp:accept和gen_tcp:recv是阻塞的,可以用prim_inet:async_accept和prim_inet:async_recv實現非阻塞