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.";
}
}
}
我要的是检查文件是否存在,并将它们发送到服务器,如果有错误,则该文件应被重新传输....
任何帮助将得到高度认可.....
最初我有netarr1 [我]然后我把它改为j,但没有运气在任何情况下 – Ankit 2011-05-11 09:55:33
实际上文件正在生成这些似乎在传输过程中的一些问题,因为当最初第一个文件传输,然后在服务器端它收到然后关闭套接字,并再次开始监听,并在这之间我猜这两个文件往往会得到错误信息,因为文件传输失败,只有循环中的第一个文件往往会传输到服务器.. – Ankit 2011-05-11 09:58:17
我实际上看不出为什么你有2个循环 - 目前,如果我理解正确,你似乎只是在“for j”循环中处理netarr2的内容,而是在netarr1.Length循环中执行。我根本看不到任何来自netarr1(即外部,i,循环)的变化输入。你能简要概述一下逻辑的逻辑吗?我真的会检查你使用的文件名是你期望的(添加跟踪代码)。在System.IO库中有很多用于解析和构建文件路径和名称的好功能。我发现这些让我在“本土”代码中犯错误。 – kpollock 2011-05-11 10:09:45