Завершение работы программы SftpFileStream заблокировано - PullRequest
0 голосов
/ 11 марта 2020

Я использую sftp для передачи файлов. Когда тестовый клиент передает файлы на сервер, сеть сервера отключается, и поток файлов SftpFileStream всегда застревает при закрытии файла. Вот мой код:

bool sendComplate = false;
do
{
    try
    {
        SftpClient sftpClient = new SftpClient("192.168.9.111", 8889, "clh", "chen");
        sftpClient.Connect();
        sftpClient.KeepAliveInterval = new TimeSpan(100);

        SftpFileStream sftStream = sftpClient.Open("tst.iso", FileMode.OpenOrCreate);
        sftStream.Timeout = new TimeSpan(1000);
        long serverFileLength = sftStream.Length;
        sftStream.Seek(serverFileLength, SeekOrigin.Current);

        FileStream fsFile = File.Open(@"F:\公司文件\我的文件\操作系统\YLMF_GHOST_WIN7_SP1_X86_2018_0628.iso", FileMode.Open);
        fsFile.Seek(serverFileLength, SeekOrigin.Current);

        byte[] buffer = new byte[1024 * 1024 * 10];
        do
        {
            int rendLength = fsFile.Read(buffer, 0, buffer.Length);
            if (rendLength > 0)
            {
                AutoResetEvent reset = new AutoResetEvent(false);
                Action writeToFile = () =>
                {
                    int sendCnt = 0;
                    do
                    {
                        try
                        {
                            sftStream.Write(buffer, 0, rendLength);
                            sftStream.Flush();
                        }
                        catch (Exception exp)
                        {
                            sendCnt++;
                        }
                    } while (sendCnt < 3 && sendCnt > 0);
                    reset.Set();
                };
                writeToFile.BeginInvoke(new AsyncCallback((rt) =>
                {
                    writeToFile.EndInvoke(rt);
                }), null);
                if (!reset.WaitOne(1000 * 120))
                {
                    fsFile.Close();
                    sftStream.Close();
                    //sftpClient.Disconnect();
                    //sftpClient.Dispose();
                    sendComplate = false;
                    break;
                }
            }
            serverFileLength += rendLength;
            if (serverFileLength >= fsFile.Length)
            {
                sftStream.Close();
                sftStream.Close();
                //sftpClient.Disconnect();
                //sftpClient.Dispose();
                sendComplate = true;
            }

        } while (serverFileLength < fsFile.Length);
    }
    catch (Exception exp)
    {

    }
} while (!sendComplate);

Приведенный выше код, который я использовал, является системным файлом 3G для тестирования. Когда файл достигает половины, сеть сервера закрывается. В это время клиент обнаруживает, что сеть работает ненормально, и отключает поток файлов.

...