У меня есть следующий метод, который соединяется с конечной точкой, когда моя программа запускает
ChannelSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var remoteIpAddress = IPAddress.Parse(ChannelIp);
ChannelEndPoint = new IPEndPoint(remoteIpAddress, ChannelPort);
ChannelSocket.Connect(ChannelEndPoint);
У меня также есть таймер, который запускается каждые 60 секунд для вызова CheckConnectivity
, который пытается отправить произвольный массив байтов в конечную точку, чтобы убедиться, что соединение все еще живое, и если сбой отправки, он попытается снова подключиться.
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));
}
}
Итак, как бы я тестировал выше, физически отключить кабель LAN от моего устройства ethernet, позволяя моему коду пытаться снова подключиться (что не получается) и повторно подключить кабель LAN.
Однако даже после повторного подключения кабеля LAN (способного к ping) ChannelSocket.Connect(ChannelEndPoint) в моем методе Reconnect всегда вызывает эту ошибку
No connection could be made because the target machine actively refused it 192.168.168.160:4001
Если бы я перезапустил все свое приложение, он будет успешно подключен. Как я могу настроить метод повторного подключения таким образом, что мне не нужно перезапускать приложение для повторного подключения к моему устройству Ethernet?