设置活动模式'一次'后,套接字服务器无法接受数据

时间:2012-03-29 04:49:13

标签: sockets erlang

我是一个二郎新手。 当我从“编程Erlang”中读取Socket章节并根据教程做一些示例时,就会出现问题。

在“混合方法(部分阻止)”一章中,我执行以下操作:

loop(Socket)->
receive
{tcp, Socket, Bin} ->
    io:format("Server received binary = ~p~n",[Bin]),
    Str = binary_to_term(Bin),
    io:format("Server (unpacked) ~p~n",[Str]),
    Reply = lib_misc:string2value(Str),
    io:format("Server replying = ~p~n",[Reply]),
    gen_tcp:send(Socket, term_to_binary(Reply)),

    inet:setopts(Socket,[binary,{active, once}]), %Configure socket as active
    loop(Socket);
{tcp_closed, Socket} ->
    io:format("Server socket closed~n")
end.

start()->
{ok,Listen} = gen_tcp:listen(2345,[binary,{packet,4},
                   {reuseaddr, true},
                   {active, once}]),
{ok, Socket} = gen_tcp:accept(Listen),
loop(Socket).

sendData(Str)->
{ok,Socket}=gen_tcp:connect("localhost",2345,[binary,{packet,4}]),
ok=gen_tcp:send(Socket, term_to_binary(Str)),
receive
{tcp,Socket,Bin}->
    io:format("Client received binary = ~p~n",[Bin]),
    Val = binary_to_term(Bin),
    io:format("Client result=~p~n",[Val])
   % gen_tcp:close(Socket)
end.

然后我打开一个这样的终端: $ ERL

  

服务器:启动()

然后打开另一个终端: $ ERL

  

客户端:的SendData( “1233”)

在服务器上,它将输出: 服务器收到二进制=<<< 131,107,0,3,49,50,51>> 服务器(解压缩)“123” 服务器回复= 123

在客户端,它将输出: 客户收到二进制=<<<<<<<< < 客户结果= 123

但是当客户端sendData第二次时,服务器上没有任何响应。 有什么不对?谢谢。

1 个答案:

答案 0 :(得分:2)

您的服务器只侦听一个连接。你启动函数也应该在另一个循环中。