Идея: Используйте класс System.Threading.Timer, чтобы определить, выполняется ли соединение один раз в секунду.Если оно не подключено, попробуйте подключиться один раз.Если соединение не удалось, зафиксируйте информацию об исключении и запишите журнал, затем Sleep for 2 секунд, а затем постоянно пытаться подключиться Повторите шаги подключения.
System.Threading.Timer timer = null;
private void BtnConnect_Click(object sender, RoutedEventArgs e)
{
timer = new Timer(new TimerCallback(TimerCall),null,Timeout.Infinite,1000);
timer.Change(0, 1000);
}
private void TimerCall(object obj)
{
if (!IsSocketConnected(socketWatch))
{
this.Dispatcher.Invoke(new Action(() =>
{
string connectIP = txtIP.Text;
string port = txtPort.Text;
try
{
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress address = IPAddress.Parse(connectIP);
socketWatch.Connect(address, int.Parse(port));
threadWatch = new Thread(RecMsg);
threadWatch.IsBackground = true;
threadWatch.Start();
}
catch
{ Thread.Sleep(2000); }
}));
}
}
private bool IsSocketConnected(Socket socket)
{
lock (this)
{
bool ConnectState = true;
bool state = socket.Blocking;
try
{
byte[] temp = new byte[1];
socket.Blocking = false;
socket.Send(temp, 0, 0);
ConnectState = true;
}
catch (SocketException e)
{
if (e.NativeErrorCode.Equals(10035)) //仍然是connect的
ConnectState = true;
else
ConnectState = false;
}
finally
{
socket.Blocking = state;
}
return ConnectState;
}
}