#c# #sockets
#c# #сокеты
Вопрос:
Я пытаюсь отправить несколько файлов на сервер за 2 секунды, и после отправки файла он удаляется, и программа перезапускается, чтобы снова сгенерировать файл, который снова необходимо отправить на сервер.
Но это работает до тех пор, пока сервер не подключится к Сети…В случае перезапуска сервера все функции программы будут работать нормально, но при вызове этой функции она продолжает отображать «Не удалось установить соединение, поскольку целевая машина активно отказалась от него» независимо от того, даже когда сервер подключается к Сети между ними..
private void sendfile()
{
timer.Stop();
RegistryKey theLocalMachine = Registry.LocalMachine;
RegistryKey theSystem2 = theLocalMachine.OpenSubKey(@"SOFTWARE\NetworkUsagemonitoring\", true);
RegistryKey interfacekey4 = theSystem2.OpenSubKey("Usagerecorder", true);
string serverno = interfacekey4.GetValue("serverno").ToString();
for (int i = 0; i < netarr1.Length; i )
{
for (int j = 0; j < netarr2.Length; j )
{
if (netarr1[i].Name == netarr2[j])
{
if (recorded[j] == 1)
{
try
{
IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse(serverno), 5656);
Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
if (File.Exists(@"C:" netarr1[i].Name "_record.xml"))
{
fileName = (@"C:" netarr1[i].Name "_record.xml");
fileName = fileName.Replace("\", "/");
while (fileName.IndexOf("/") > -1)
{
filePath = fileName.Substring(0, fileName.IndexOf("/") 1);
fileName = fileName.Substring(fileName.IndexOf("/") 1);
}
byte[] fileNameByte = Encoding.ASCII.GetBytes(fileName);
if (fileNameByte.Length > 850 * 1024)
{
return;
}
byte[] fileData = File.ReadAllBytes(filePath fileName);
byte[] clientData = new byte[4 fileNameByte.Length fileData.Length];
byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);
fileNameLen.CopyTo(clientData, 0);
fileNameByte.CopyTo(clientData, 4);
fileData.CopyTo(clientData, 4 fileNameByte.Length);
clientSock.Connect(ipEnd);
clientSock.Send(clientData);
clientSock.Close();
recorded[j] = 0;
File.Delete(@"C:" netarr1[i].Name "_record.xml");
}
else
{
UpdateNetwork_Interface();
}
}
catch (Exception ex)
{
LogEvent("No connection could be made because the target machine actively refused it", EventLogEntryType.Information);
break;
}
finally
{
j ;
}
}
else
{
UpdateNetwork_Interface();
}
}
}
}
}
Я хочу, чтобы сервер отключился или отобразилось сообщение «Не удалось установить соединение, поскольку целевая машина активно отказалась от него»…программа должна продолжать цикл и беспрепятственно перемещаться до тех пор, пока сервер не подключится к сети и обновленный файл не будет отправлен на сервер.
Ответ №1:
Ну, ваша обработка исключений ошибочна. Вы перехватываете (например, исключение) и распечатываете сообщение об ошибке, которое вы процитировали. Вполне возможно, что фактическое исключение связано с файлами, которые вы записываете и удаляете. возможно, некоторые файлы не удалось стереть или открыть.
Глядя на код, я подозреваю, что проблема в том, что вы на самом деле никогда не закрываете сокет, если есть исключение.
Вы должны добавить следующее к предложению finally.
if (clientSocket!=null)
clientSocket.Close();
И вам следует распечатать фактическое сообщение об исключении в журнале ошибок, чтобы вы знали, что на самом деле происходит при возникновении ошибки.