erlang套接字和gen_server - 服务器端没有收到数据

时间:2012-11-19 13:07:55

标签: sockets erlang supervisor gen-server

简而言之: 我正在尝试创建一个客户端连接并发送/接收消息的套接字服务器(基于学习一些erlang教程中的sockserv代码http://learnyousomeerlang.com/buckets-of-sockets) 服务器端组件: supervisor - unique,从一开始就开始,使用gen_server行为生成进程 gen_server行为进程 - 每个进程处理一个连接。

客户方: 客户端连接到套接字并发送几个字节的数据然后断开连接。

代码详情 我的代码与本教程中的代码非常相似。主管是完全相同的。 gen_server组件被简化,因此它只有一个handle_info case,它应该捕获所有内容并打印它。

问题 连接成功,但是当客户端发送数据时,服务器的行为就像没有收到数据一样(我希望在发生这种情况时调用handle_info)。

handle_info确实被调用,但仅在客户端断开连接并且报告此事件时带有消息。

我的尝试 我已经玩过用Erlang或Java编写的不同客户端,我尝试设置套接字的主动/被动状态。本教程的作者在发送消息后设置{active,once}。我最终只是在创建AcceptSocket之后设置{active,true} :( gen_server proc初始化为包含由主管创建的原始ListenSocket的状态)

handle_cast(accept, S = #state{socket=ListenSocket}) ->

     {ok, AcceptSocket} = gen_tcp:accept(ListenSocket),
     io:format("accepted connection ~n", []),

      sockserv_sup:start_socket(), % a new acceptor is born, praise the lord
      inet:setopts(AcceptSocket, [{active, true}]),
      send(AcceptSocket, "Yellow", []),
      {noreply, S#state{socket=AcceptSocket, next=name}}.

send(Socket, Str, Args) ->
    ok = gen_tcp:send(Socket, io_lib:format(Str++"~n", Args)),
    ok.

   handle_info(E, S) ->
       io:format("mothereffing unexpected: ~p~n", [E]),
       {noreply, S}.

它几乎没有效果。 handle_info仅在连接丢失时被调用,因为客户端断开连接。每当客户端发送数据时都不会发生任何事情。

可能是什么问题?我花了很多时间在这上面,我真的不知道。 非常感谢。

2 个答案:

答案 0 :(得分:0)

您是否尝试过在http://www.erlang.org/doc/man/inet.html#setopts-2

中设置其他选项

inet:setopts(AcceptSocket,[{active,true}])

例如:

{packet,line}一次读一行

二进制文件以二进制形式读取数据。

我最近也在基于该教程进行了类似的练习,我使用的选项是:

inet:setopts(LSocket,[{active,true},{packet,line},binary,{reuseaddr,true}]),

答案 1 :(得分:0)

最后,请注意选项。我确实没有注意这组选项的含义。我尝试了更加狭窄的情况并将其解决了。我的问题是{packet,line}选项,这意味着\ n被认为是一个消息分隔符。