2011-05-11 159 views
1

我做了一个Windows服务的动机是将多个文件发送到指定的服务器。多个文件发送到服务器

 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]) 
       { 
        IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse(serverno), 5656); 
        Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
        try 
        { 
         if (File.Exists(@"C:\" + netarr1[j].Name + "_record.xml")) 
         { 
          fileName = (@"C:\" + netarr1[j].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[j].Name + "_record.xml"); 
         } 
         else 
         { 
          Update1Network_Interface(); 
         } 
        } 
        catch (Exception ex) 
        { 
         if (ex.Message == "No connection could be made because the target machine actively refused it") 
         { 
          LogEvent("No connection could be made because the target machine actively refused it", EventLogEntryType.Information); 
          break; 
         } 
        } 
        finally 
        { 
         if (clientSock != null) 
         { 
          LogEvent("Client Socket Closed", EventLogEntryType.Information); 
          clientSock.Close(); 
          sendfile(); 
         } 
        } 
       } 
      } 
     } 

     restart(); 
    } 

但是,因为该服务文件来启动其execution..there似乎有三种文件,这需要发送到服务器,但它往往只发送一个经常忽略了另一个......至于中的代码片段在两个for循环下,我正在检查文件的存在,如果它们存在,那么它们需要传输。

如在服务器端的测试目的以下是代码

 private void Form1_Load(object sender, EventArgs e) 
    { 
     FTServerCode.receivedPath = (@"C:\Receiving\"); 

     if (FTServerCode.receivedPath.Length > 0) 
      backgroundWorker1.RunWorkerAsync(); 

    } 
} 
class FTServerCode 
{ 
    IPEndPoint ipEnd; 
    Socket sock; 
    public FTServerCode() 
    { 
     ipEnd = new IPEndPoint(IPAddress.Any, 5656); 
     sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
     sock.Bind(ipEnd); 
    } 
    public static string receivedPath; 
    public static string curMsg = "Stopped"; 
    public void StartServer() 
    { 
     try 
     { 
      curMsg = "Starting..."; 
      sock.Listen(100); 

      curMsg = "Running and waiting to receive file."; 
      Socket clientSock = sock.Accept(); 

      byte[] clientData = new byte[1024 * 5120]; 

      int receivedBytesLen = clientSock.Receive(clientData); 
      curMsg = "Receiving data..."; 

      int fileNameLen = BitConverter.ToInt32(clientData, 0); 
      string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen); 

      BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath +"/"+ fileName, FileMode.Append)); ; 
      bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen); 

      curMsg = "Saving file..."; 

      bWrite.Close(); 
      clientSock.Close(); 
      StartServer(); 

     } 
     catch (Exception ex) 
     { 
      curMsg = "File Receving error."; 
     } 
    } 
} 

我要的是检查文件是否存在,并将它们发送到服务器,如果有错误,则该文件应被重新传输....

任何帮助将得到高度认可.....

回答

0
上乍一看

,你是在内部循环使用netarr1 [J],请将.Name ......应该说是netarr1 [i] .Name(或netarr2 [j] .Name,因为你只有在它们是equ时才执行人)??

也许i和j是很难在文本区分开来,也许更具描述性的NAEM

而且System.IO.Path.Combine是好事,对文件路径使用....

+0

最初我有netarr1 [我]然后我把它改为j,但没有运气在任何情况下 – Ankit 2011-05-11 09:55:33

+0

实际上文件正在生成这些似乎在传输过程中的一些问题,因为当最初第一个文件传输,然后在服务器端它收到然后关闭套接字,并再次开始监听,并在这之间我猜这两个文件往往会得到错误信息,因为文件传输失败,只有循环中的第一个文件往往会传输到服务器.. – Ankit 2011-05-11 09:58:17

+0

我实际上看不出为什么你有2个循环 - 目前,如果我理解正确,你似乎只是在“for j”循环中处理netarr2的内容,而是在netarr1.Length循环中执行。我根本看不到任何来自netarr1(即外部,i,循环)的变化输入。你能简要概述一下逻辑的逻辑吗?我真的会检查你使用的文件名是你期望的(添加跟踪代码)。在System.IO库中有很多用于解析和构建文件路径和名称的好功能。我发现这些让我在“本土”代码中犯错误。 – kpollock 2011-05-11 10:09:45