Como reconectar-se a um soquete normalmente
Eu tenho um método a seguir que se conecta a um ponto final quando meu programa é iniciado
ChannelSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var remoteIpAddress = IPAddress.Parse(ChannelIp);
ChannelEndPoint = new IPEndPoint(remoteIpAddress, ChannelPort);
ChannelSocket.Connect(ChannelEndPoint);
Eu também tenho um timer definido para disparar a cada 60 segundos para chamarCheckConnectivity
, que tenta enviar uma matriz de bytes arbitrária para o ponto final para garantir que a conexão ainda esteja ativa e, se o envio falhar, tentará se reconectar.
public bool CheckConnectivity(bool isReconnect)
{
if (ChannelSocket != null)
{
var blockingState = ChannelSocket.Blocking;
try
{
var tmp = new byte[] { 0 };
ChannelSocket.Blocking = false;
ChannelSocket.Send(tmp);
}
catch (SocketException e)
{
try
{
ReconnectChannel();
}
catch (Exception ex)
{
return false;
}
}
}
else
{
ConnectivityLog.Warn(string.Format("{0}:{1} is null!", ChannelIp, ChannelPort));
return false;
}
return true;
}
private void ReconnectChannel()
{
try
{
ChannelSocket.Shutdown(SocketShutdown.Both);
ChannelSocket.Disconnect(true);
ChannelSocket.Close();
}
catch (Exception ex)
{
ConnectivityLog.Error(ex);
}
ChannelSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var remoteIpAddress = IPAddress.Parse(ChannelIp);
ChannelEndPoint = new IPEndPoint(remoteIpAddress, ChannelPort);
ChannelSocket.Connect(ChannelEndPoint);
Thread.Sleep(1000);
if (ChannelSocket.Connected)
{
ConnectivityLog.Info(string.Format("{0}:{1} is reconnected!", ChannelIp, ChannelPort));
}
else
{
ConnectivityLog.Warn(string.Format("{0}:{1} failed to reconnect!", ChannelIp, ChannelPort));
}
}
Então, como eu testaria o acima, é desconectar fisicamente o cabo LAN do meu dispositivo ethernet, permitindo que meu código tente se reconectar (o que obviamente falha) e reconectar novamente o cabo LAN.
No entanto, mesmo após reconectar o cabo da LAN (capaz de executar ping), o ChannelSocket.Connect (ChannelEndPoint) no meu método Reconnect sempre gera esse erro
No connection could be made because the target machine actively refused it 192.168.168.160:4001
Se eu reiniciar meu aplicativo inteiro, ele será conectado com êxito. Como ajustar meu método de reconexão para que não seja necessário reiniciar o aplicativo para reconectar ao dispositivo Ethernet?