erlang tcp active 模式

gen_tcp 的 active的值为once在编程上实现控制,

如果采用了非被被动模式,

虚拟机会把接受到的信息用一种消息的方式发给进程邮箱。

譬如下面是服务器接收的一段http请求,receiver:是每次接收的提示信息,

这里可以看到http其实是按照先后顺序发上来的,如果服务器是做http的,

用到once模式是最好不过的,如在第一条receiver匹配成功检查格式正确后再决定是否接收

后面的,如果第一条就不对,后面就没有必要再去取,这种数据有种依赖关系,

假如下面的所有匹配被分别看成是A,B ...J的话,如果不用once,那么你的loop体大概是

这样

扫描二维码关注公众号,回复: 1203324 查看本文章

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


猜你喜欢

转载自jias.iteye.com/blog/1504372