[erlang-questions] TCP Kernel bug/feature

Martin Carlson <>
Thu May 17 13:18:24 CEST 2007


Hi all,

Came across a strange Linux kernel bug/feature this morning while testing
a TCP application we've written.

The following code captures the behavior.

server(Ip, Port) ->
    {ok, Socket} = gen_tcp:listen(Port, [{ip, Ip}, {reuseaddr, true},
                                         {packet, 4}, binary]),
    {ok, Client} = gen_tcp:accept(Socket),
    gen_tcp:close(Socket),
    Client.


client(Ip, Port) ->
    case gen_tcp:connect(Ip, Port, [{packet, 4}, binary]) of
        {ok, Client} ->
            Client;
        {error, econnrefused} ->
            client(Ip, Port);
        {error, Reason} ->
            erlang:error(Reason)
    end.


node1() ->
    server({127,0,0,1}, 12345),
    halt().


node2() ->
    client("127.0.0.1", 12345),
    io:format("Connection lost~n"),
    client("127.0.0.1", 12345).

When running node1() on one Erlang node and node2 on another
this creates a socket connected to itself. One can capture the socket and
pass data forth and back.

netstat gives the following result:
tcp        0      0 127.0.0.1:12345         127.0.0.1:12345        
ESTABLISHED

This however only seem to work on Suse 9.3 with a stock kernel and has
probably been fixed in newer versions of the kernel.

uname say:
2.6.11.4-20a-smp #1 SMP Wed Mar 23 21:52:37 UTC 2005 i686 i686 i386 GNU/Linux


--
Martin Carlson
Erlang Training & Consulting
http://www.erlang-consulting.com




More information about the erlang-questions mailing list