Socket: Detect connection close
Vladimir Panteleev
vladimir at thecybershadow.net
Mon Mar 24 23:47:19 PDT 2014
On Monday, 24 March 2014 at 18:06:56 UTC, nrgyzer wrote:
> Alright, that world work. But what about sending 10 Bytes,
> waiting some minutes (probably some hours) and sending 10 Bytes
> again. Is it possible to do this on the same Socket?
Yes. Unless your socket is marked as non-blocking, the read
operation will block until more data is available (or the
connection gets closed).
> My scenario is: I've one central server and multiple clients.
> The clients are connecting to the server and send (or request)
> some information. After that the clients are simply "sleeping"
> for an unknown time. For instance client 1 for 1 seconds,
> client 2 for 1 minute, client 3 for 1 hours and client 4 for 1
> day. After that time they resend/request some more information
> from the server... my questions regarding this are:
>
> - When I client connects, the server creates a thread. How can
> I determine that I can terminate the thread because the
> connection is inactive (for instance because the client closed
> the connection or some connecting issues)?
As mentioned previously, you know that the connection was closed
cleanly on the remote side when receive returns an empty buffer.
> - How can the client check if the connection is alive? (If the
> connection isn't alive, I need to reconnect)
You generally have to implement this yourself. Silence on the
wire can mean two things:
1. No data is being sent;
2. Something is preventing data from being sent (lost packets, a
peer was shut down or restarted, Internet routing changes,
squirrel chewed through a wire).
Generally network software implements "ping" packets that are
sent occasionally (once every few seconds or minutes). If no
"ping" packets are received throughout a certain interval, the
connection is considered dead.
TCP also has a "keepalive" option which does this for you, but it
is an optional TCP feature and thus may or may not work.
More information about the Digitalmars-d-learn
mailing list