<html><head><meta http-equiv="Content-Type" content="text/html charset=GB2312"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">That’s really fantastic!!! And Socket also works!<div>That’s to say, we can remotely open file or use the same driver by message passing.</div><div><br></div><div>Thanks again! <br><div><br><div><div>在 2014年11月21日,23:25,T Ty <<a href="mailto:tty.erlang@gmail.com">tty.erlang@gmail.com</a>> 写道:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr">You can pass Pid and References in a message using ! <div><br></div><div>This is an example of how trivial writing a FTP-like client in Erlang.</div><div><br></div><div>On machine 1. </div><div>File = file:open(FileName, [read]).</div><div>PidOfProcessOnMachine2 ! {remote_file, File}.</div><div><br></div><div>On machine 2.</div><div>receive</div><div>    {remote_file, File} -></div><div>       {ok, Data} = file:read(File, 1000000),</div><div>       write_to_local_disk(Data)</div><div>end</div><div><br></div><div>Now, that said I have only tried it with File /Pid references and not with Socket. </div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Nov 21, 2014 at 12:05 PM, Lhfcws GMail <span dir="ltr"><<a href="mailto:lhfcws@gmail.com" target="_blank">lhfcws@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thanks a lot!  gen_tcp:controlling_process is indeed what I want.<br>
And let me confirm your answer:<br>
1.  Objects like socket and file handler can be pass in spawn arguments.<br>
2.  But they can not be passed by ! message passing.<br>
<br>
Am I right?<br>
--------------<br>
<br>
在 2014年11月21日,19:50,Niclas Eklund <<a href="mailto:nick@tail-f.com">nick@tail-f.com</a>> 写道:<br>
<br>
> Hello again!<br>
><br>
> Forgot to answer your second question. Yes, you can spawn a new process that will "own" the connection, but then you need to use this function - <a href="http://www.erlang.org/doc/man/gen_tcp.html#controlling_process-2" target="_blank">http://www.erlang.org/doc/man/gen_tcp.html#controlling_process-2</a> You typically want  to keep the listen process rather lightweight (do very little) since using blocking accept is common and then the listen process needs to be restarted when doing a live code upgrade. See for example this code - <a href="https://github.com/erlang/otp/blob/maint/lib/orber/src/orber_iiop_net_accept.erl" target="_blank">https://github.com/erlang/otp/blob/maint/lib/orber/src/orber_iiop_net_accept.erl</a> It's doing a bit more, i.e. only allows a certain number of concurrent incoming requests, but as you can see it's minimal.<br>
><br>
> /Nick<br>
><br>
> On 11/21/2014 12:43 PM, Niclas Eklund wrote:<br>
>> Hi!<br>
>><br>
>> I'm afraid that you don't handle the returned values correctly. See this page - <a href="http://www.erlang.org/doc/man/gen_tcp.html" target="_blank">http://www.erlang.org/doc/man/gen_tcp.html</a> - for more info. Should be:<br>
>><br>
>> server() -><br>
>>    {ok, LSock} = gen_tcp:listen(5678, [binary, {packet, 0},<br>
>>                                        {active, false}]),<br>
>>    {ok, Sock} = gen_tcp:accept(LSock),<br>
>>    {ok, Bin} = do_recv(Sock, []),<br>
>>    ok = gen_tcp:close(Sock),<br>
>>    Bin.<br>
>><br>
>> do_recv(Sock, Bs) -><br>
>>    case gen_tcp:recv(Sock, 0) of<br>
>>        {ok, B} -><br>
>>            do_recv(Sock, [Bs, B]);<br>
>>        {error, closed} -><br>
>>            {ok, list_to_binary(Bs)}<br>
>>    end.<br>
>><br>
>> /Nick<br>
<div class="HOEnZb"><div class="h5">>><br>
>><br>
>><br>
>> On 11/21/2014 08:44 AM, Lhfcws GMail wrote:<br>
>>> Hi, I’m new to Erlang.<br>
>>> I have a question about the message passed among the Erlang processes.<br>
>>> 1. I create a Socket or FileHandler, can I use ! to send it to another process and still works well?<br>
>>><br>
>>> demo code:<br>
>>><br>
>>>    ListenSocket = gen_tcp:listen(1055, [{active, true}]),<br>
>>>    Socket = gen_tcp:accept(ListenSocket),<br>
>>>    From ! {new_socket, Socket}.<br>
>>><br>
>>><br>
>>> 2. What if I invoking ’spawn’ to pass the Socket to the new process ?<br>
>>><br>
>>> demo code:<br>
>>><br>
>>>    NewProcess = fun(Socket) -> … end.<br>
>>><br>
>>>    ListenSocket = gen_tcp:listen(1055, [{active, true}]),<br>
>>>    Socket = gen_tcp:accept(ListenSocket),<br>
>>>    spawn(NewProcess, Socket).<br>
>>><br>
>>> =======<br>
>>><br>
>>> I know that the message in the receiver is a copy of the one in the sender, but I’m a little confused about the questions above. Could someone just explain this?<br>
>>> Thank you.<br>
>>> _______________________________________________<br>
>>> erlang-questions mailing list<br>
>>> <a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
>>> <a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
>><br>
><br>
<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br></div>
</blockquote></div><br></div></div></body></html>