日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Erlang TCP Socket的接收进程的2种方案

發(fā)布時(shí)間:2023/12/10 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Erlang TCP Socket的接收进程的2种方案 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)自:http://blog.csdn.net/summerhust/article/details/8740973

?

一旦打開(kāi)了一個(gè)使用TCP連接的套接字,它就始終保持打開(kāi)狀態(tài),直至任何一方關(guān)閉它或因?yàn)橐粋€(gè)錯(cuò)誤而終止。在建立一個(gè)連接時(shí),一般為每一次請(qǐng)求產(chǎn)生一個(gè)新進(jìn)程,只要有請(qǐng)求被處理,就保持這個(gè)進(jìn)程的存活。

假設(shè)有一個(gè)監(jiān)聽(tīng)進(jìn)程,其任務(wù)是等待傳入的TCP請(qǐng)求。只要一個(gè)請(qǐng)求到達(dá),響應(yīng)該連接請(qǐng)求的進(jìn)程就變成了接收進(jìn)程,有2種方案:

1. 產(chǎn)生新的進(jìn)程并成為接收進(jìn)程,而監(jiān)聽(tīng)者返回并繼續(xù)監(jiān)聽(tīng)下一個(gè)新的連接請(qǐng)求:

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)聽(tīng)進(jìn)程成為接收進(jìn)程,并使產(chǎn)生的新進(jìn)程成為新的監(jiān)聽(tīng)者:

?

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).??

?

說(shuō)明:

(1)? 創(chuàng)建一個(gè)套接字的進(jìn)程(通過(guò)調(diào)用gen_tcp:accept或gen_tcp:connect)也就是該套接字的控制進(jìn)程,該套接字所收到的任何消息都會(huì)轉(zhuǎn)發(fā)給這個(gè)控制進(jìn)程,如果控制進(jìn)程消亡,那么該套接字也會(huì)自行關(guān)閉。我們可以通過(guò)gen_tcp:controlling_process(Socket, NewPid)函數(shù)來(lái)把一個(gè)套接字的控制進(jìn)程改為新的控制進(jìn)程N(yùn)ewPid;

(2) gen_tcp:accept和gen_tcp:recv是阻塞的,可以用prim_inet:async_accept和prim_inet:async_recv實(shí)現(xiàn)非阻塞。

總結(jié)

以上是生活随笔為你收集整理的Erlang TCP Socket的接收进程的2种方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。