Сокет-сервер не может принимать данные после установки активного режима «один раз» - PullRequest
1 голос
/ 29 марта 2012

Я новичок в эрланге.Когда я читаю главу «Сокеты» из раздела «Программирование на Erlang» и делаю несколько примеров в соответствии с руководством, возникает проблема.

В главе «Гибридный подход (частичная блокировка)» я делаю следующее:

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

server: start ().

и открываю другой терминал следующим образом: $erl

клиент: sendData ("1233").

На сервере будет выводиться: Сервер получил двоичный файл = << 131,107,0,3,49,50, 51 >> Сервер (без упаковки) "123" Ответ сервера = 123

На клиенте он выдаст: Клиент получил двоичный файл = << 131,97,123 >> Результат клиента = 123

Нокогда клиент посылает данные второй раз, на сервере нет никакого ответа.Что-то не так?Спасибо.

1 Ответ

2 голосов
/ 29 марта 2012

Ваш сервер прослушивает только одно соединение.Ваша функция запуска должна быть в другом цикле.

...