Я подключаюсь к удаленному серверу в C # через сокет и пересылаю данные через него; при отключении я пытаюсь восстановить соединение, создав новый сокет и повторно инициализировав его.
Это работает для меня, когда я тестирую, выдергивая кабель Ethernet и подключая его через несколько минут, но иногда (возможно, каждые несколько часов) я получаю одно из двух исключений при подключении и не могу подключиться ...
System.Net.Sockets.SocketException: установленное соединение было прервано программным обеспечением на вашем хост-компьютере
.......
System.Net.Sockets.SocketException: существующее соединение было принудительно закрыто удаленным хостом
Если я перезапускаю приложение, все снова работает нормально, поэтому мне интересно, почему созданиеновый сокет не работает.Возможно, я где-то пропускаю инициализацию?Есть идеи?Я использую один и тот же метод для подключения каждый раз:
public static bool OpenConnection(string siteName)
{
bool success;
IPEndPoint ip = new IPEndPoint(IPAddress.Parse(serverIp), Convert.ToInt16(serverRemotePort));
try
{
client = null;
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Console.WriteLine("Try to connect to the server ..." + ip.Address.ToString());
client.Connect(ip);
Console.WriteLine("Connection established");
//Send the nameSite first
string nameSite = EncryptString(siteName, pwd, initVector) + "*";
byte[] dataSite = new byte[100];
dataSite = Encoding.ASCII.GetBytes(nameSite);
client.Send(dataSite, dataSite.Length, SocketFlags.None);
Console.WriteLine("NameSite send");
success = true;
}
catch (SocketException e)
{
success = false;
Console.WriteLine("Unable to connect to the server : " + e.StackTrace);
}
return success;
}
Я пытаюсь восстановить соединение следующим образом в catch, счетчик увеличивается с каждой итерацией цикла while.
if (count % 20 == 0)
{
try
{
if (OpenConnection(siteName))
connected = true;
EventLog.WriteEntry("Connection re-established.");
}
catch (SocketException socketEx)
{
Console.WriteLine("Reconnection failed. Storing data locally. \n\n " + socketEx);
EventLog.WriteEntry("Reconnection failed. Storing data locally. \n\n " + socketEx);
}
}
Конструктор просто инициализирует IP-адрес и номер порта. Почему некоторые типы отключений не позволяют мне повторно подключиться без перезапуска, есть идеи?