Как закрыть сокет в хвостовой рекурсии? - PullRequest
0 голосов
/ 20 мая 2011

Я создаю один клиент udp, и мне нужно отправлять сообщения каждые 5 секунд, поэтому я пишу

start() ->
  {ok, Sock} = gen_udp:open(0, []),
  send(Sock).

send(Sock) ->
  gen_udp:send(Sock, "127.0.0.1", 3211, "hello world"),
  timer:sleep(5000),
  send(Sock).  

Я хочу знать хорошее место для закрытия сокета

1 Ответ

7 голосов
/ 20 мая 2011

Если ваша цель - отправлять сообщения каждые 5 секунд, то зачем вам закрывать сокет? Если у вас есть логика, чтобы определить, когда вы отправили достаточное количество сообщений (например, их количество), тогда это будет место для закрытия сокета.

Вот пример того, как вы можете считать сообщения в длительном процессе:

start() ->
    {ok, Sock} = gen_udp:open(...),
    send(Sock, 0),
    gen_udp:close(Sock).

send(Sock, N) when N >= ?MAX_MESSAGE_COUNT ->
    ok;
send(Sock, N) ->
    ...
    send(Sock, N+1).

Подсчитав до заданного числа, а не вниз, вы можете изменить это число во время выполнения процесса, просто перезагрузив код.

...