[erlang-questions] Simple TCP Server

Joe Armstrong <>
Wed Dec 18 08:07:37 CET 2013


Try something like this

-module(mock_tcp).
-export([start/1]).

%% start with
%%   erl -s mock_tcp start <port> <file>
%% for example
%%   erl -s mock_tcp start 1234 foo.txt

start([APort, AFilename]) ->
    Port = list_to_integer(atom_to_list(APort)),
    Filename = atom_to_list(AFilename),
    {ok, Listen} = gen_tcp:listen(Port, [binary]),
    spawn(fun() -> connect(Listen, Filename) end),
    io:format("Server available on port ~p. Reading from file ~p.",
[Port, Filename]).

I'd recommend ~p in the format rather than ~w (~p is "pretty-print"),
~w might not print
what you had expected)

Cheers

/Joe


On Tue, Dec 17, 2013 at 10:54 PM, Fred Youhanaie <> wrote:
>
> To add to the other suggestions:
>
> 0. Does it work if you run it from the erlang shell?
>
> 1. If you're starting it with "erl -s ..." then the port number will be
> passed as atom, rather than integer! So you'll need to convert to integer.
>
> 2. In the get_date() you probably meant to use file:read_line/1, rather than
> io:get_line/1.
>
> Cheers
> f.
>
>
>
> On 17/12/13 18:53, Ari King wrote:
>>
>> Hi,
>>
>> The code below results in "init terminating in do_boot." Seemingly the
>> problem is on line 5, does anyone see what is wrong with it? Additionally,
>> I'm trying to pass the port in as a command line argument, but for some
>> reason it doesn't work and I need to hardcode it.
>>
>> -module(mock_tcp).
>> -export([start/1]).
>>
>> start([Port, Filename]) ->
>>    {ok, Listen} = gen_tcp:listen(Port, [binary]),
>>    spawn(fun() -> connect(Listen, Filename) end),
>>    io:format("Server available on port ~w. Reading from file ~w.", [Port,
>> Filename]).
>>
>> connect(Listen, Filename) ->
>>    {ok, Socket} = gen_tcp:accept(Listen),
>>    spawn(fun() -> connect(Listen, Filename) end),
>>    {ok, Device} = file:open(Filename, read),
>>    get_data(Device, Socket).
>>
>> get_data(Device, Socket) ->
>>    case io:get_line(Device) of
>>      {ok, Data} ->
>>        gen_tcp:send(Socket, Data),
>>        get_data(Device, Socket);
>>      eof ->
>>        file:close(Device),
>>        gen_tcp:close(Socket)
>>    end.
>>
>> Thanks.
>>
>> -Ari
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-questions



More information about the erlang-questions mailing list