Erlang gen_tcp补充(1)

gen_tcp.erl

accept(S) ->

 

    case inet_db:lookup_socket(S) of    
{ok, Mod} ->  %% Mod 要么是inet_tcp, 要么是inet6_tcp.
   Mod:accept(S);
Error ->
   Error

 

    end.

inet_tcp.erl

accept(L)         -> 
    case prim_inet:accept(L) of  %% 调用prim_inet模块
{ok, S} ->
   inet_db:register_socket(S, ?MODULE),  
   {ok,S};
Error -> Error
    end.

prim_inet.erl

accept(L)            -> accept0(L, -1).
accept(L, infinity)  -> accept0(L, -1);
accept(L, Time)      -> accept0(L, Time).


accept0(L, Time) when is_port(L), is_integer(Time) ->
    case async_accept(L, Time) of
{ok, Ref} ->
   receive   %%阻塞receive
{inet_async, L, Ref, {ok,S}} ->
   accept_opts(L, S);
{inet_async, L, Ref, Error} ->
   Error
   end;
Error -> Error
    end.

————————————————————————————————————————————————————————————————

gen_tcp:accept 和 recv 都是阻塞。  erlang有prim_inet:async_accept

异步accept,要用asyc_accept:

{ok, Mod} = inet_db:lookup_socket(LSock),
inet_db:register_socket(Sock, Mod),  这两步也是必须的, gen_tcp也有这两步①②。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值