gen_tcp 的 active的值爲once在編程上實現控制,
如果採用了非被被動模式,
虛擬機會把接受到的信息用一種消息的方式發給進程郵箱。
譬如下面是服務器接收的一段http請求,receiver:是每次接收的提示信息,
這裏可以看到http其實是按照先後順序發上來的,如果服務器是做http的,
用到once模式是最好不過的,如在第一條receiver匹配成功檢查格式正確後再決定是否接收
後面的,如果第一條就不對,後面就沒有必要再去取,這種數據有種依賴關係,
假如下面的所有匹配被分別看成是A,B ...J的話,如果不用once,那麼你的loop體大概是
這樣
loop() ->
A ->done;
B->done;
....
J ->done
一次性要將所有的可能都寫上,如果是錯誤的格式,那麼可能C後面的一直不會匹配,而且也
影響函數風格
如果是once
loop() ->
A ->done;
B ->done;
上面A能匹配後再once
loop() ->
C->done;
http://localhost:4017/web/ser
receiver:{http,#Port<0.2186>,{http_request,'GET',{abs_path,"/web/ser"},{1,1}}}
receiver:{http,#Port<0.2186>,
{http_header,14,'Host',undefined,"127.0.0.1:4015"}}
receiver:{http,#Port<0.2186>,
{http_header,24,'User-Agent',undefined,
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.04 (lucid) Firefox/3.6.17"}}
receiver:{http,#Port<0.2186>,
{http_header,8,'Accept',undefined,
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}}
receiver:{http,#Port<0.2186>,
{http_header,11,'Accept-Language',undefined,"en-us,en;q=0.5"}}
receiver:{http,#Port<0.2186>,
{http_header,10,'Accept-Encoding',undefined,"gzip,deflate"}}
receiver:{http,#Port<0.2186>,
{http_header,9,'Accept-Charset',undefined,
"ISO-8859-1,utf-8;q=0.7,*;q=0.7"}}
receiver:{http,#Port<0.2186>,{http_header,51,'Keep-Alive',undefined,"115"}}
receiver:{http,#Port<0.2186>,
{http_header,2,'Connection',undefined,"keep-alive"}}
receiver:{http,#Port<0.2186>,http_eoh}
receiver:{tcp_closed,#Port<0.2186>}