将文件从客户端发送到服务器

时间:2011-04-17 00:03:41

标签: c# sockets

我试图在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 个答案:

答案 0 :(得分:1)

嗯,你的异常处理是错误的。您正在捕获(Exception ex)并打印出您引用的错误消息。 ACTUALL异常完全可能与您正在编写和擦除的文件有关。也许某些文件无法删除或打开。

查看代码,我怀疑问题是如果出现异常,你永远不会真正关闭套接字。

您应该将以下内容添加到finally子句中。

if (clientSocket!=null)
   clientSocket.Close();

您应该将实际的异常消息打印到错误日志中,以便了解发生错误时的实际情况。