einval error when gen_tcp:recv after successful gen_tcp:send
Sean Hinde
sean.hinde@REDACTED
Thu Dec 9 23:52:06 CET 2004
On 9 Dec 2004, at 18:03, klacke@REDACTED wrote:
> On Thu, Dec 09, 2004 at 04:15:19PM +0100, Ericsson, Bjorn wrote:
>
>
>> when the client tries to use gen_tcp:recv. This is where it
>> receives
>> {error, einval}.
>>
>>
>> get_response(Request, Port) ->
>> %%% Setup connection %%%
>> case gen_tcp:connect("localhost", Port,
>> [list, {packet, 0},{reuseaddr,
>> true}])
>
>
>
> Your socket is (as they are by default) in active mode, this means
> that it's not allowed to call recv() on the socket, instead of
> actively recv()'ing your process will get messages on the form of:
>
> {tcp, Socket, Data}
>
>
> So either you have tp specify {active, false} as a socket option
> when you create the socket, or rewrite your code to receive
> messages instead of actively recv() 'ing.
>
> recv() and {active , false} has the advantage that you
> get flow control for free (through TCP/IP) whereas
> {active, true} has the advantage that it's more flexible.
>
>
> Read erlang man pages for 'gen_tcp' and 'inet' several times.
>
Also..
One very nice way to use sockets is with the use of the now well
documented {active, once} option. This allows you to get the benefit of
flow control, but retain the nice semantics of packets being just
another message into your process.
call inet:setopts(S, [{active, once}]) each time after receiving a
packet when you are ready to receive the next one.
Sean
More information about the erlang-questions
mailing list