如何在尾递归中关闭Socket?

时间:2011-05-20 05:36:31

标签: sockets tcp erlang udp

我创建了一个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 个答案:

答案 0 :(得分:7)

如果您的目标是每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).

通过计算一个给定的数字,而不是向下,您可以在流程运行时通过简单地重新加载代码来更改此数字。