.net 错误:C#中的FTP中的远程主机强制关闭了现有连接?
当我试图进行多次上传时,我得到了上述错误 在FTP中,我有两个类,一个是FTPdatatransfer,另一个是FTPcommand 在我的主法师身上,我正在做这样的事情.net 错误:C#中的FTP中的远程主机强制关闭了现有连接?,.net,ftp,.net,Ftp,当我试图进行多次上传时,我得到了上述错误 在FTP中,我有两个类,一个是FTPdatatransfer,另一个是FTPcommand 在我的主法师身上,我正在做这样的事情 FTPCommand ftpcommand = new FTPCommand(ServerAddress, UserName, Password); ftpcommand.Login(); ftpcommand.sendCommand("CWD ", "/home/praveena/RMS"); ftpcommand.se
FTPCommand ftpcommand = new FTPCommand(ServerAddress, UserName, Password);
ftpcommand.Login();
ftpcommand.sendCommand("CWD ", "/home/praveena/RMS");
ftpcommand.sendCommand("PASV");
ftpcommand.sendCommand("STOR ","FTP.pdf");
ftpcommand.sendCommand("STOR ","linux.pdf");
ftpcommand.sendCommand("QUIT");
一次上传工作正常,另一个上传则出现上述错误
FTPCommand.cs
public void sendCommand(String command, params string[] strfilename)
{
string ServerAddress = "172.24.18.240";
string UserName = "praveena";
string Password = "praveena";
if (command == "STOR ") //Uploading to Server
{
FTPDataTransfer ftpdatatransfer = new FTPDataTransfer(ServerAddress, UserName, Password, 10000, iport);
foreach (string dir in strfilename)
{
command = "STOR " + strfilename[0];
}
Send(command);
ftpdatatransfer.Upload(strfilename[0]);
this.readResponse();
}
else if (command == "MKD ")
{
command = "MKD " + strfilename[0];
Send(command);
this.readResponse();
}
else if (command == "CWD ")
{
command = "CWD " + strfilename[0];
Send(command);
this.readResponse();
}
else if (command == "NLST ") //Listing Files from Server.
{
FTPDataTransfer ftpdatatransfer = new FTPDataTransfer(ServerAddress, UserName, Password, 10000, iport);
foreach (string dir in strfilename)
{
command = "NLST " + "*";
}
Send(command);
ftpdatatransfer.GetFilelist();
this.readResponse();
}
else
{
Send(command);
this.readResponse();
if (command == "PASV")
{
iport = GetPort();
}
}
}
public void Send(string command)
{
Byte[] cmdBytes = Encoding.ASCII.GetBytes((command + "\r\n").ToCharArray());
clientSocket.Send(cmdBytes, cmdBytes.Length, 0);
}
public int GetPort()
{
int index1 = result.IndexOf('(');
int index2 = result.IndexOf(')');
string ipData = this.result.Substring(index1 + 1, index2 - index1 - 1);
int[] parts = new int[6];
int len = ipData.Length;
int partCount = 0;
string buf = "";
for (int i = 0; i < len && partCount <= 6; i++)
{
char ch = char.Parse(ipData.Substring(i, 1));
if (char.IsDigit(ch))
buf += ch;
else if (ch != ',')
throw new WinFTPClient.FTPCommand.FtpException("Malformed PASV result: " + result);
if (ch == ',' || i + 1 == len)
{
try
{
parts[partCount++] = int.Parse(buf);
buf = "";
}
catch (Exception ex)
{
throw new WinFTPClient.FTPCommand.FtpException("Malformed PASV result (not supported?): " + this.result, ex);
}
}
}
string ipAddress = parts[0] + "." + parts[1] + "." + parts[2] + "." + parts[3];
int port = (parts[4] << 8) + parts[5];
return port;
}
FTP服务器很可能限制了同时上传的数量。没有办法从客户端强制执行此操作。不,我发现上传一个文件后连接关闭,我想这就是无法上传第二个文件的原因。啊。是的,有些服务器使用“中止关闭”,因为它可以让它们更快地回收资源。@stephen:我没听懂你的话?@Swapnil连接什么时候关闭?我们说的是服务器连接(21),对吗?它在第一次上传后关闭,这很明显。当它试图上传第二个文件时,它会说“无法连接到远程服务器”因为上传方法在第一次上传后关闭了连接,所以有没有一种方法可以让我获得数据传输的端口范围,这样我就可以在不同的端口上分配请求;我可以用谷歌在至少一个地方找到它。也许如果您自己编写代码,您的运气会更好。:)或者只使用BCL中的
WebClient
。@bzlm:谢谢。有人在谷歌上发布了我的代码,我不知道。这段代码是我写的。请提供我的链接,我可以找到我的代码。
public void Upload(string strfilename)
{
Thread thread = new Thread(new ThreadStart(() => UploadFile(strfilename)));
thread.Start();
}
public void UploadFile(string strfilename)
{
Socket cSocket = createDataSocket();
//open stream to read file
FileStream input = new FileStream(strfilename, FileMode.Open);
while ((bytes = input.Read(buffer, 0, buffer.Length)) > 0)
{
cSocket.Send(buffer, bytes, 0);
}
input.Close();
if (cSocket.Connected)
{
cSocket.Close();
}
// this.readResponse();
MessageBox.Show("File Uploaded successfully");
}
public Socket createDataSocket()
{
IPAddress ipAddress = IPAddress.Parse("172.24.18.240");
Socket socket = null;
IPEndPoint ep = null;
try
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ep = new IPEndPoint(Dns.GetHostEntry(ipAddress).AddressList[0], port);
socket.Connect(ep);
}
catch (Exception ex)
{
// doubtfull....
if (socket != null && socket.Connected) socket.Close();
throw new WinFTPClient.FTPCommand.FtpException("Can't connect to remote server", ex);
}
return socket;
}