erlang socket

目标是验证“将客户端连接的socket绑定到一个gen_server后,发送到socket 的消息将由gen_server的handle_info/2 处理”。

接收客户端socket 连接的server:

  1. -module(“myserver”).
  2. -export([start/2],[stop/0]).
  3. start()->
  4.     %%监听端口
  5.     {ok,ListenSocket}=gen_tcp:listen(1234,[binary,{packet,4},
  6.                                                         {reuseaddr,true},
  7.                                                         {active,true}]),
  8.     %%获取客户端链接
  9.     {ok,Socket} = gen_tcp:accept(ListenSocket),
  10.     %%关闭监听
  11.     gen_tcp:close(ListenSocket),
  12.     %%启动一个gen_server
  13.     {ok,Pid}=socketManager:start_link(),
  14.     %%将客户端链接socket 绑定到gen_server
  15.     gen_tcp:controlling_process(Socket,Pid).

持有客户端连接socket的gen_server:

  1. -module(socketManager).
  2. -behaviour(gen_server).
  3. -export([init/1,handle_call/3,handle_cast/2,handle_info/2,terminate/2,code_change/3,start_link/0]).
  4. -record(state,{}).
  5. start_link()->
  6.     gen_server:start_link({local,mymanager},?MODULE,[],[]).
  7. init([])->
  8.     {ok,#state{}}.
  9. handle_call(_Request,_From,State)->
  10.     {reply,ok,State}.
  11. handle_cast(_Msg,State)->
  12.     {noreply,State}.
  13. handle_info(Info,State)->
  14.     io:format(“msg received: ~n”,[]),
  15.     io:format(“input msg is: ~w~n”,[Info]),
  16.     {noreply,State}.
  17. terminate(_Reason,_State)->
  18.     ok.
  19. code_change(_Old,State,_Ext)->
  20.     {ok,State}.

编译以上两个文件,并运行myserver:start(),然后直接telnet 1234 这个端口,任意输入字符,有信息打印出来则OK。

 

验证结果证明:“ 将客户端连接的socket绑定到一个gen_server后,发送到socket 的消息将由gen_server的handle_info/2 处理” 是成立的。

 

mark:编译期间出现过一个 warning: wrong number of arguments infomart call  是因为调用一个函数,参数没填对。

———————————-血泪分隔线——————————————-

最近写个聊天室程序时才发现,上面的验证是错误的。具体的看下一篇文章吧。



发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

(Spamcheck Enabled)