Я решил это для своего кометного приложения Erlang, части которого я покажу в этом блоге . По сути, вы не хотите, чтобы сокет находился в активном режиме все время; вы просто хотите активировать его после прочтения запроса клиента и перед возвратом ответа.
Вот пример обработчика запроса:
comet(Req) ->
Body = Req:recv_body(),
io:format("~nBody: ~p~n", [Body]),
Socket = Req:get(socket),
inet:setopts(Socket, [{active, once}]),
Response = connection:handle_json(Body),
inet:setopts(Socket, [{active, false}]),
io:format("~nSending Response: ~s~n", [Response]),
Req:ok({"application/json", [], Response}).
Для моей выгоды вызов io: format - это просто запись в консоль. Важной частью является то, что я установил {active, Once} на сокете после чтения тела из запроса и непосредственно перед вызовом функции, которая содержит запрос и возвращает данные. Я также выключаю активный режим; сокет может быть повторно использован в определенных режимах HTTP.