No recomendaría que intente escribir solo para probar el socket. Y tampoco retransmita en la propiedad Connected de .NET.
Si usted quiere saber si el punto extremo remoto todavía está activo, puede utilizar TcpConnectionInformation:
TcpClient client = new TcpClient(host, port);
IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties();
TcpConnectionInformation[] tcpConnections = ipProperties.GetActiveTcpConnections().Where(x => x.LocalEndPoint.Equals(client.Client.LocalEndPoint) && x.RemoteEndPoint.Equals(client.Client.RemoteEndPoint)).ToArray();
if (tcpConnections != null && tcpConnections.Length > 0)
{
TcpState stateOfConnection = tcpConnections.First().State;
if (stateOfConnection == TcpState.Established)
{
// Connection is OK
}
else
{
// No active tcp Connection to hostName:port
}
}
client.Close();
Ver también:
TcpConnectionInformation en MSDN
IPGlobalProperties en MSDN
Descripción de TcpState estados
Netstat en Wikipedia
Y aquí está como un método de extensión en TcpClient. respuesta
public static TcpState GetState(this TcpClient tcpClient)
{
var foo = IPGlobalProperties.GetIPGlobalProperties()
.GetActiveTcpConnections()
.SingleOrDefault(x => x.LocalEndPoint.Equals(tcpClient.Client.LocalEndPoint));
return foo != null ? foo.State : TcpState.Unknown;
}
Sí. La capa de conexión se gestionará utilizando excepciones. La IOException arrojada tiene la excepción interna establecida en una SocketException, que contiene toda la información necesaria para detectar los tiempos de espera o los sockets cerrados de forma remota. – Luca