FTP之‘基础连接已关闭:服务器提交了协议冲突’错误探析
這段時間由于工作的關系,一直研究FTP 服務器/客戶端的相關程序,發(fā)現了不少問題,有些確實是微軟的bug(或者說相關代碼不夠健壯) 。
一、微軟IE瀏覽器作為FTP客戶端的bug
?????? 上傳含中文字符的多級目錄的失敗的bug,文件名是否中文無關,只要目錄中出現中文字符,就會出現該問題。用網絡嗅探器探測交互的數據發(fā)現,創(chuàng)建多個目錄成功后,在用“CWD”命令調轉當前目錄時FTP客戶端出現bug,含中文字符的目錄名稱,中文信息被過濾掉,導致整個拷貝過程失敗。
?????? 這個bug微軟某個版本的補丁應該修改了(相關信息我沒有查到),因為在Vista系統上IE的ftp客戶端正常。我的出現問題的系統是Windows XP sp2,IE6.0。有心的朋友可以測試一下。
二、“基礎連接已關閉:服務器提交了協議沖突”的錯誤信息
????? 這個問題應該很出名,在網上可以搜索一大片,不過大部分是Http協議沖突,少有ftp的。我這里僅是針對ftp使用過程中的問題。
????? 這個問題是在使用微軟.net 2.0 框架集 “WebClient”類的時出現的問題,相關代碼如下:???
?private void btnDown_Click(object sender, EventArgs e)
??????? {
??????????? //string URL =? @"ftp://admin:admin@"+@txtIP.Text+"//NORFlash//";
??????????? string URL = @"ftp://" + txtIP.Text + "//HardDisk//";
??????????? string strFileName = "";
??????????? lstInfo.Items.Clear();
??????????? if (openFileDialog.ShowDialog() == DialogResult.OK)
??????????? {
??????????????? strFileName = openFileDialog.FileName;
??????????? }
??????????? else
??????????? {
??????????????? lstInfo.Items.Insert(0, DateTime.Now.ToString() + " : 用戶取消操作");
??????????????? return;
??????????? }
??????????? //-----------------------------------------------
??????????? if (File.Exists(strFileName) == true)
??????????? {
??????????????? try
??????????????? {
??????????????????? lstInfo.Items.Insert(0, DateTime.Now.ToString() + " : 開始下載 ...");
??????????????????? Application.DoEvents();???????????????????
??????????????????? client.UploadFile(URL + @"/AAA.text", strFileName);???????????????????
??????????????????? lstInfo.Items.Insert(0, DateTime.Now.ToString() + " : 下載完畢");
??????????????????? Application.DoEvents();
??????????????? }
??????????????? catch (WebException exp)
??????????????? {
??????????????????? lstInfo.Items.Insert(0, DateTime.Now.ToString() + " : 錯誤:" + exp.Message);
??????????????????? return;
??????????????? }
??????????? }
??????????? else
??????????? {
??????????????? lstInfo.Items.Insert(0, DateTime.Now.ToString() + " : 指定文件不存在");
??????????? }??????????
??????? }
用這個代碼同樣出現該問題:
??????? private void Upload(string uri,string filename)
??????? {
??????????? FileInfo fileInf = new FileInfo(filename);
??????????? uri = uri+"//"+ fileInf.Name;
??????????? FtpWebRequest reqFTP;
??????????? // 根據uri創(chuàng)建FtpWebRequest對象
??????????? reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
??????????? // ftp用戶名和密碼
??????????? reqFTP.Credentials = new NetworkCredential("guest", "");
??????????? // 默認為true,連接不會被關閉
??????????? // 在一個命令之后被執(zhí)行
??????????? reqFTP.KeepAlive = false;
??????????? // 指定執(zhí)行什么命令
??????????? reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
??????????? // 指定數據傳輸類型
??????????? reqFTP.UseBinary = true;
??????????? // 上傳文件時通知服務器文件的大小
??????????? reqFTP.ContentLength = fileInf.Length;
??????????? // 緩沖大小設置為2kb
??????????? int buffLength = 2048;
??????????? byte[] buff = new byte[buffLength];
??????????? int contentLen;
??????????? // 打開一個文件流 (System.IO.FileStream) 去讀上傳的文件
??????????? FileStream fs = fileInf.OpenRead();
??????????? try
??????????? {
??????????????? // 把上傳的文件寫入流
??????????????? Stream strm = reqFTP.GetRequestStream();
??????????????? // 每次讀文件流的2kb
??????????????? contentLen = fs.Read(buff, 0, buffLength);
??????????????? // 流內容沒有結束
??????????????? while (contentLen != 0)
??????????????? {
??????????????????? // 把內容從file stream 寫入 upload stream
??????????????????? strm.Write(buff, 0, contentLen);
??????????????????? contentLen = fs.Read(buff, 0, buffLength);
??????????????? }
??????????????? // 關閉兩個流
??????????????? strm.Close();
??????????????? fs.Close();
??????????? }
??????????? catch (Exception ex)
??????????? {
??????????????? MessageBox.Show(ex.Message, "Upload Error");
??????????? }
??????? }
?相關界面如下:?
?
服務器,執(zhí)行到這一步便執(zhí)行失敗,此時客戶端程序就會顯示如下錯誤
?
這是和我編寫的FTP Server出現問題,和Wince平臺上的FTP,Moxa 設備上的FTP都正常,我程序唯一的不同就是支持中文信息。也許就是中文信息不能識別的問題?果不其然,請看下圖:
?
此時客戶端正常:
?
?實際測試發(fā)現,“WebClient”類并不是不支持“中文”只要在登錄連接過程中ftp Server發(fā)送英文信息即可,其他信息可以是中文。
我想這應該是微軟的程序的bug,應該其他客戶端都能正常使用,難道偏偏該指令的有問題?!
后續(xù)的幾篇文章,我會繼續(xù)介紹ftp相關的東西,希望大家多多關注。
?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的FTP之‘基础连接已关闭:服务器提交了协议冲突’错误探析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中小企业数据异地备份容灾解决方案
- 下一篇: 日记 [2007年02月03日]邮件退信