我试图在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();
}
}
}
}
}
我想要的是服务器脱机或“无法建立连接,因为目标计算机主动拒绝它”显示...程序应该继续循环并且不受阻碍地移动直到服务器联机,更新的文件将发送到服务器。
答案 0 :(得分:1)
嗯,你的异常处理是错误的。您正在捕获(Exception ex)并打印出您引用的错误消息。 ACTUALL异常完全可能与您正在编写和擦除的文件有关。也许某些文件无法删除或打开。
查看代码,我怀疑问题是如果出现异常,你永远不会真正关闭套接字。
您应该将以下内容添加到finally子句中。
if (clientSocket!=null)
clientSocket.Close();
您应该将实际的异常消息打印到错误日志中,以便了解发生错误时的实际情况。