<br><br><div class="gmail_quote">On Sat, Nov 8, 2008 at 11:23 AM, Kevin <span dir="ltr"><<a href="mailto:q2h46uw02@sneakemail.com">q2h46uw02@sneakemail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
using controlling_process sounds like a great solution, but I've tried<br>
that.  In the cleaned up code below, I try to assign<br>
the socket to the Fsm, but I get the error {error,not_owner}.</blockquote><div> </div><div>I use controlling_process all the time with no problem. May I suggest an alternative? <br><ol><li>In the gen_server, open a socket and spawn_link a listener process that waits in an gen_tcp:accept on the socket.</li>
<li>When it gets an {ok, Sock}, start the fsm, passing it the socket. If necessary, put it in a waiting state until it is handed the ownership.<br></li><li>Give ownership of the socket to the fsm and (if necessary) tell it that it's got the socket so it can start working.<br>
</li><li>Loop back to the accept.<br></li></ol>Let the fsm do all the socket work, and the gen_server just kick off fsms when listening.<br><br>Example (the ServerRef, unused here, is for calls the listener might want to make to the gen_server, like storing the Pid of each fsm in its state, for example):<br>
<br><span style="font-family: courier new,monospace;">listener(ServerRef, LSocket) -></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    case gen_tcp:accept(LSocket) of</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">        {ok, Socket} -></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">            case my_fsm:start(Socket) of</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                {ok, Pid} -></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">                    case gen_tcp:controlling_process(Socket, Pid) of</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                        ok -></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">                            my_fsm:socket_ready(Pid),</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                            listener(ServerRef, LSocket);</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">                        _Error -></span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                            gen_tcp:close(Socket),</span><br><span style="font-family: courier new,monospace;">                            my_fsm:stop(Pid),</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                            listener(ServerRef, LSocket)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">                    end;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                _Error -></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">                    gen_tcp:close(Socket),</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                    listener(ServerRef, LSocket)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">            end;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">        _Error -></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">            io:format("listener shutdown, accept error: ~p\n", [_Error])</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    end.</span><br style="font-family: courier new,monospace;"><br></div></div>Hope this helps.<br>Regards,<br>Edwin Fine<br>