<div dir="ltr"><div>Why not take a look at mochiweb or cowboy (which uses ranch) and see how they do it?<br><br></div>wes<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Dec 19, 2013 at 11:02 AM, Ari King <span dir="ltr"><<a href="mailto:ari.brandeis.king@gmail.com" target="_blank">ari.brandeis.king@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div>Thanks for all the help/insights/suggestions. Below is a working, albeit naive, TCP server.  At this juncture, I'd appreciate suggestions on how I can improve it. I do plan on incorporating OTP behaviours, once I have a better understanding of. <br>
<div class="im">
<br>-module(mock_tcp).<br>-export([start/1]).<br>     <br>start([AtomPort, AtomFilename]) -><br>  Port = list_to_integer(atom_to_list(AtomPort)),<br>  Filename = atom_to_list(AtomFilename),<br></div>  Pid = spawn(fun() -><div class="im">
<br>
                  {ok, Listen} = gen_tcp:listen(Port, [binary, {reuseaddr, true}]),<br>                  spawn(fun() -> connect(Listen, Filename) end),<br></div>                  timer:sleep(infinity)<br>              end),<br>

  io:format("Server (~p) available on port ~p. Reading from file ~p.", [Pid, Port, Filename]).<br><br>connect(Listen, Filename) -><div class="im"><br>  {ok, Socket} = gen_tcp:accept(Listen),<br>  spawn(fun() -> connect(Listen, Filename) end),<br>

  {ok, Device} = file:open(Filename, read),<br>  get_data(Device, Socket).<br><br>get_data(Device, Socket) -><br></div>  case io:get_line(Device, "") of<br>    eof -> <br>      file:close(Device),<br>      gen_tcp:close(Socket);<div class="im">
<br>
    Data -><br>      gen_tcp:send(Socket, Data),<br>      get_data(Device, Socket)<br></div>  end.<br><br></div>Thanks!<span class="HOEnZb"><font color="#888888"><br><br></font></span></div><span class="HOEnZb"><font color="#888888">-Ari<br>
</font></span></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Dec 18, 2013 at 5:48 PM, Fred Youhanaie <span dir="ltr"><<a href="mailto:fly@anydata.co.uk" target="_blank">fly@anydata.co.uk</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
So, 1 down and 2 to go :-)<br>
<br>
0. Does it work if you run it from the *erlang* shell?<div><br>
<br>
2. In the get_date() you probably meant to use file:read_line/1, rather than io:get_line/1.<br>
<br></div>
The error message is saying that by the time gen_tcp:accept/1 is called, the socket has been closed. Try item #0 above.<br>
<br>
BTW, since you're learning, I have resisted giving you the complete solution so that you enjoy the discovery first hand :)<br>
<br>
Cheers<span><font color="#888888"><br>
f.</font></span><div><div><br>
<br>
<br>
On 18/12/13 17:40, Ari King wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I incorporated the suggestions and it solved the issue of setting up a<br>
socket to listen on a specified port(line 5). However, a new issue has<br>
risen while attempting to accept a connection on the listening socket. The<br>
error message follows:<br>
<br>
=ERROR REPORT==== 18-Dec-2013::17:32:47 ===<br>
Error in process <0.32.0> with exit value:<br>
{{badmatch,{error,closed}},[{<u></u>mock_tcp,connect,2,[{file,"<u></u>mock_tcp.erl"},{line,12}]}]}<br>
<br>
I'm starting the server via erl -s mock_tcp start 8080 <path_to_file><br>
<br>
-module(mock_tcp).<br>
-export([start/1]).<br>
<br>
start([AtomPort, AtomFilename]) -><br>
   Port = list_to_integer(atom_to_list(<u></u>AtomPort)),<br>
   Filename = atom_to_list(AtomFilename),<br>
   {ok, Listen} = gen_tcp:listen(Port, [binary, {reuseaddr, true}]),<br>
   spawn(fun() -> connect(Listen, Filename) end),<br>
   io:format("Server available on port ~p. Reading from file ~p.", [Port,<br>
Filename]).<br>
<br>
connect(Listen, Filename) -><br>
   % Following line causes the error<br>
   {ok, Socket} = gen_tcp:accept(Listen),<br>
   spawn(fun() -> connect(Listen, Filename) end),<br>
   {ok, Device} = file:open(Filename, read),<br>
   get_data(Device, Socket).<br>
<br>
get_data(Device, Socket) -><br>
   case io:get_line(Device) of<br>
     {ok, Data} -><br>
       gen_tcp:send(Socket, Data),<br>
       get_data(Device, Socket);<br>
     eof -><br>
       file:close(Device),<br>
       gen_tcp:close(Socket)<br>
   end.<br>
<br>
Thanks.<br>
<br>
-Ari<br>
</blockquote>
</div></div></blockquote></div><br></div>
</div></div><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></blockquote></div><br></div>