How to check if a socket is connected/disconnected in C#?
As Paul Turner answered Socket.Connected
cannot be used in this situation. You need to poll connection every time to see if connection is still active. This is code I used:
bool SocketConnected(Socket s)
{
bool part1 = s.Poll(1000, SelectMode.SelectRead);
bool part2 = (s.Available == 0);
if (part1 && part2)
return false;
else
return true;
}
It works like this:
s.Poll
returns true if- connection is closed, reset, terminated or pending (meaning no active connection)
- connection is active and there is data available for reading
s.Available
returns number of bytes available for reading- if both are true:
- there is no data available to read so connection is not active
As zendar wrote, it is nice to use the Socket.Poll
and Socket.Available
, but you need to take into consideration that the socket might not have been initialized in the first place. This is the last (I believe) piece of information and it is supplied by the Socket.Connected
property. The revised version of the method would looks something like this:
static bool IsSocketConnected(Socket s)
{
return !((s.Poll(1000, SelectMode.SelectRead) && (s.Available == 0)) || !s.Connected);
/* The long, but simpler-to-understand version:
bool part1 = s.Poll(1000, SelectMode.SelectRead);
bool part2 = (s.Available == 0);
if ((part1 && part2 ) || !s.Connected)
return false;
else
return true;
*/
}
The Socket.Connected
property will tell you whether a socket thinks it's connected. It actually reflects the status of the last send/receive operation performed on the socket.
If the socket has been closed by your own actions (disposing the socket, calling methods to disconnect), Socket.Connected
will return false
. If the socket has been disconnected by other means, the property will return true
until you next attempt to send or recieve information, at which point either a SocketException
or ObjectDisposedException
will be thrown.
You can check the property after the exception has occurred, but it's not reliable before.