gen_tcp:send with timeout

Matthias Lang matthias@REDACTED
Sun Feb 22 03:31:59 CET 2004


Eric Newhuis writes:
 > Is there a "standard" idiom for calling gen_tcp:send with a timeout?
 > 
 > I'd like to say gen_tcp:send(Socket, Data, Timeout) but there is no 
 > such (documented) function, my server is queueing, and my process is 
 > blocked forever.

Better late than never...

One way to do it using documented functions is to spawn a 'disposable'
process each time you want to send something, and supervise it with a
timer, e.g.

   Parent = self(),
   Ref = make_ref(),

   Disposable = fun() ->
      ok = gen_tcp:send(S, Bin),
      Parent ! Ref
   end,

   spawn_link(Disposable),

   receive
      Ref -> ok
   after 5000 ->
     exit(timeout)  % or do something more complex
   end,

This is quite general, but it feels roundabout. There's a more direct,
but undocumented, variant:

   inet:setopts(Socket, [{send_timeout, N}])

It would be interesting to know what happens when you use the above
option and send a large binary all in one go, e.g.:

   gen_tcp:send(Socket, Large_binary)

and the socket blocks halfway through the binary. It's not documented,
so who knows... I haven't investigated.

See also:

  http://www.erlang.org/ml-archive/erlang-questions/200209/msg00076.html

Matthias



More information about the erlang-questions mailing list