tcp erlang

¿Cómo detecto la desconexión de tcp-client con gen_tcp?



erlang (1)

En resumen, la razón de esto es que no hay actividad en el socket que pueda determinar que el otro extremo se haya cerrado. El primer send parece funcionar porque opera en un socket que, a todos los efectos, parece estar conectado y en funcionamiento. Pero esa actividad de escritura determina que el otro extremo está cerrado, por lo que el segundo send falla como se esperaba.

Si primero leyera o recv desde el socket, aprendería rápidamente que el otro extremo estaba cerrado. Alternativamente, si el socket estuviera en un modo active Erlang, también aprendería sobre el cierre del otro extremo porque active modos active sondean el socket.

Además de si el socket está en modo active o no, esto no tiene nada que ver con Erlang. Si tuviera que escribir el código C directamente en la API de sockets, por ejemplo, vería el mismo comportamiento.

Estoy tratando de usar el módulo gen_tcp. Hay un ejemplo de código del lado del servidor, que tengo problemas.

%% First, I bind server port and wait for peer connection {ok, Sock} = gen_tcp:listen(7890, [{active, false}]), {ok, Peer} = gen_tcp:accept(Sock), %% Here client calls `gen_tcp:close/1` on socket and goes away. %% After that I am tryin'' send some message to client SendResult = gen_server:send(Peer, <<"HELLO">>), %% Now I guess that send is failed with {error, closed}, but... ok = SendResult.

Cuando llamo gen_tcp:send/2 nuevamente, la segunda llamada devolverá {error, closed} como se esperaba. Pero quiero entender, ¿por qué la primera llamada tuvo éxito? ¿Me faltan algunos detalles específicos de tcp? Este comportamiento extraño (para mí) es solo para la conexión {activa, falsa}.