quick side note.  while John's answer is correct.  I think that Thilani
is trying to spawn a short lived process that creates a socket
connection.<br>
<br>
problem with that is that when the call (connect_to_server) returns,
the process will exit and the socket will close since the socket lives
and dies with the process calling gen_tcp:connect(...)<br>
<br>
you could hand control over to another process to keep this from happening, but this code is clearly not doing so.<br>
the function is:<br>
gen_tcp:controlling_process(Socket, NewSocketOwnerPid)<br>
<br>
but from a client perspective, this kind of defeats the purpose.<br>
<br>
what you really want to do is have the gen server initiate the connection itself (from the init method most likely).<br>
<br>
then it will own the process.  and if it fails to connect, the gen server will bomb out letting you know it failed.<br>
<br>
if you are trying to make the gen server "generic" and not understand
how the socket is created, you could always pass in a fun to
gen_server:start(M,[fun() -> gen_tcp:connect(...)])<br>
<br>
then in your gen_server:<br>
init([ConFun]) -><br>
{ok,Socket} = ConFun().<br>
<br>
benefits are:<br>
gen_server doesn't know how the socket is created, but it owns the
socket itself.  so as long as the gen_server is alive, the socket lives
with it (unless closed by the other end).<br>
<br>
Hopefully that was helpful,<br>
<br>
-David<br>
<br><br><div class="gmail_quote">On Mon, Dec 29, 2008 at 10:39 AM, John Hughes <span dir="ltr"><<a href="mailto:john.hughes@quviq.com">john.hughes@quviq.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;">
Hi Thilani,<br>
<br>
As Chandru said, you just send the result back to the parent process as a<br>
message. Here's some code:<br>
<br>
spawn_call(M,F,As) -><br>
    Parent = self(),<br>
    Child = spawn_link(fun() -> Parent ! {self(),apply(M,F,As)} end),<br>
    receive {Child,X} -> X end.<br>
<br>
Note the receive matches on the child's pid, so can't be confused by any<br>
other messages in the parent's mailbox. Sample call:<br>
<br>
76> foo:spawn_call(lists,reverse,[[1,2,3]]).<br>
[3,2,1]<br>
<br>
John<br>
<br>
> From: "Thilani Abeysinghe" <<a href="mailto:a.thilani@gmail.com">a.thilani@gmail.com</a>><br>
> Subject: [erlang-questions] spawn_link<br>
> To: <a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
> Message-ID:<br>
> <<a href="mailto:d8e8f490812290303y3b89841eu645927839fbe2578@mail.gmail.com">d8e8f490812290303y3b89841eu645927839fbe2578@mail.gmail.com</a>><br>
> Content-Type: text/plain; charset="iso-8859-1"<br>
<div class="Ih2E3d">><br>
> I have a problem of how to get the return value of a function when<br>
><br>
> spawn_link(Fun) ->pid() is used.<br>
><br>
> Im going to use above function in following manner.<br>
><br>
> init([]) -><br>
><br>
> ChildPid = erlang:spawn_link(?MODULE, connect_to_server, [Ip,Port, ConId,<br>
> self(),State]).<br>
><br>
> connect_to_server(Ip, Port, ConId, ParentPid,State) -><br>
>  case Result= gen_tcp:connect(Ip, Port,<br>
>  [binary, {packet, 0}]) of<br>
>  {ok, Socket} -><br>
>           io:format("Socket Received:~w~n",[Socket]),<br>
>          ok =(catch gen_server:call(g_srv, {add_conn, self(), ConId,<br>
> Socket})),<br>
>          NewState = State#state{socket= Socket};<br>
>  {error, Reason} -><br>
>          io:format("connection error host Ip:~w Port: ~w ~w ~n",<br>
> [Ip,Port,Reason]) ,<br>
>         connect_to_server(Ip, Port, ConId, ParentPid,State)<br>
>  end.<br>
><br>
> I want to get the return value of connect_to_server function. How can I do<br>
> that.<br>
><br>
</div>> Regards<br>
><br>
> Thilani<br>
<div><div></div><div class="Wj3C7c"><br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://www.erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br>