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>}