gen_tcp bug ?

Chandrashekhar Mullaparthi <>
Tue Jun 14 00:56:46 CEST 2005

On 13 Jun 2005, at 12:55, Raimo Niskanen wrote:

> I confirm this behaviour, and I regard it as a bug that I am about to
> fix. Not being a socket guru myself I wonder, what is the expected
> behaviour of gen_tcp:recv(Fd, N) when there are less than N
> bytes in the receive buffer but more than 0?
> a) To return with the available bytes.
> b) To wait until there are N bytes, but if the socket gets closed
>    or some error occurs return with the available bytes and let
>    subsequent calls indicate the error.
> My guess is b) but I would like a second opinion.

The best compromise is to probably introduce a new return value as 
Bengt suggested - {error, closed, Data}. This also avoids the problem 
which Per raised. Or in the case of 'active' sockets, a {tcp_closed, 
Socket, Data} message.

The same problem exists when the option {active, once} or {active, 
true} is set and the {packet, PacketType} mode is used?


srv1() ->
     {ok, LS} = gen_tcp:listen(5678,[{active, true}, binary, {packet, 
     {ok, A} = gen_tcp:accept(LS),

srv1_loop(A) ->
	{tcp, A, Bin} ->
	    io:format("Got ~p bytes\n", [size(Bin)]),
	{tcp_closed, A} ->
	    io:format("Socket closed...~n", []);
	Err ->
	    io:format("Recvd ~p~n", [Err])

cli() ->
     {ok, Fd} = gen_tcp:connect(localhost, 5678, [{active, false}]),
     gen_tcp:send(Fd, lists:duplicate(150, $A)),


More information about the erlang-questions mailing list