[erlang-questions] EPIPE and TCP sockets
Fri Oct 12 00:44:17 CEST 2007
Tony Garnock-Jones <> wrote:
>If I understand correctly, the BSD sockets interface to TCP lets you
>know when a TCP socket is closed with outbound data unacknowledged, by
>sending the sender SIGPIPE (or returning EPIPE if SIGPIPE is blocked).
Hm, I don't think that's correct - AFAIK SIGPIPE/EPIPE happens only if
you try to write more data to a socket when the other end is considered
to be closed (either due to receiving FIN or RST, or due to
Closing the socket with unack'ed data normally doesn't do anything in
particular, the close() returns immediately but the kernel holds on to
the data and tries to (re)transmit it according to the standard TCP
logic, and you won't be told if it fails.
You can change the latter behaviour via the SO_LINGER socket option, to
have the close() block until the data is ack'ed or failure/timeout. To
quote an earlier message here: "This is actually available for gen_tcp
too, via the undocumented 'linger' option - whether it really works I
don't know." And thinking about it, I'm not sure *how* it will/would
work - there would need to be a "non-blocking blocking on close()"
(maybe there is) to avoid having the whole runtime block...
More information about the erlang-questions