Erlang gen_tcp补充(2)

这次讲的是gen_tcp:send 的阻塞 与 直接调用 erlang:port_command的非阻塞。
————————————————————————————————————————————————————————
gen_tcp.erl  源码在 kernel
gen_tcp.erl
send(S, Packet) when is_port(S) ->
    case inet_db:lookup_socket(S) of
{ok, Mod} ->
    Mod:send(S, Packet);  %%此处Mod模块是inet_tcp.erl 
Error ->
    Error
    end.

inet_tcp.erl
%%
%% Send data on a socket
%% 调用prim_inet模块
%%
send(Socket, Packet, Opts) -> prim_inet:send(Socket, Packet, Opts). 
send(Socket, Packet) -> prim_inet:send(Socket, Packet, []).



prim_inet.erl
send(S, Data, OptList) when is_port(S), is_list(OptList) ->
    ?DBG_FORMAT("prim_inet:send(~p, ~p)~n", [S,Data]),
    try erlang:port_command(S, Data, OptList) of  %%提交数据
	false -> % Port busy and nosuspend option passed
	    ?DBG_FORMAT("prim_inet:send() -> {error,busy}~n", []),
	    {error,busy};
	true ->
	    receive     %% <strong>gen_tcp:send默认是在send后会等driver给他反馈,这个等待是阻塞的</strong>
		{inet_reply,S,Status} ->
		    ?DBG_FORMAT("prim_inet:send() -> ~p~n", [Status]),
		    Status
	    end
    catch
	error:_Error ->
	    ?DBG_FORMAT("prim_inet:send() -> {error,einval}~n", []),
	     {error,einval}
    end.

erlang:port_command 建议用此函数直接提交数据
其他文章: http://blog.yufeng.info/archives/1581

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值