Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 错误:C#中的FTP中的远程主机强制关闭了现有连接?_.net_Ftp - Fatal编程技术网

.net 错误:C#中的FTP中的远程主机强制关闭了现有连接?

.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

当我试图进行多次上传时,我得到了上述错误 在FTP中,我有两个类,一个是FTPdatatransfer,另一个是FTPcommand 在我的主法师身上,我正在做这样的事情

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;
    }