Если ваша цель - отправлять сообщения каждые 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).
Подсчитав до заданного числа, а не вниз, вы можете изменить это число во время выполнения процесса, просто перезагрузив код.