<div dir="ltr"><div class="gmail_extra">We have fully refused from using gen_fsm and especially in handling protocol states in gen_fsm.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Everywhere we use something like:</div><div class="gmail_extra"><br></div><div class="gmail_extra">handle_info({tcp, Socket, Input},  #state{protocol_state = S0} = State) -></div><div class="gmail_extra">   {ok, OutputCommands, S1} = some_protocol:handle(Input, S0),</div><div class="gmail_extra">   ..handle somehow OutputCommands</div><div class="gmail_extra">  inet:setopts(Socket, [{active,once}]),</div><div class="gmail_extra">  {noreply, State#state{protocol_state = S1}}.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Such approach allows to record Input to file and write a test for output commands. Also it allows more easily handle situation when there is more than 1 command in Input packet.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div></div>