FTP之‘基础连接已关闭:服务器提交了协议冲突’错误探析

news/2024/7/4 12:56:12

         这段时间由于工作的关系,一直研究FTP 服务器/客户端的相关程序,发现了不少问题,有些确实是微软的bug(或者说相关代码不够健壮) 。

一、微软IE浏览器作为FTP客户端的bug

       上传含中文字符的多级目录的失败的bug,文件名是否中文无关,只要目录中出现中文字符,就会出现该问题。用网络嗅探器探测交互的数据发现,创建多个目录成功后,在用“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创建FtpWebRequest对象 
            reqFTP  =  (FtpWebRequest)FtpWebRequest.Create( new  Uri(uri));

            
//  ftp用户名和密码
            reqFTP.Credentials  =   new  NetworkCredential( " guest " "" );

            
//  默认为true,连接不会被关闭
            
//  在一个命令之后被执行
            reqFTP.KeepAlive  =   false ;

            
//  指定执行什么命令
            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 " );
            }
        }

 相关界面如下: 

服务器,执行到这一步便执行失败,此时客户端程序就会显示如下错误

这是和我编写的FTP Server出现问题,和Wince平台上的FTP,Moxa 设备上的FTP都正常,我程序唯一的不同就是支持中文信息。也许就是中文信息不能识别的问题?果不其然,请看下图:

此时客户端正常:

 实际测试发现,“WebClient”类并不是不支持“中文”只要在登录连接过程中ftp Server发送英文信息即可,其他信息可以是中文。

我想这应该是微软的程序的bug,应该其他客户端都能正常使用,难道偏偏该指令的有问题?!

后续的几篇文章,我会继续介绍ftp相关的东西,希望大家多多关注。

                                                                                          [叶帆工作室]

 





http://www.niftyadmin.cn/n/3655779.html

相关文章

JavaScript 深克隆和浅克隆

概念 浅克隆: 直接将存储在栈中的值赋值给对应的变量;如果是基本类型则直接赋值给对应的值;如果是引用类型则赋值的是地址; 深克隆: 就是直接把值赋值给对应的变量,从而产生一个与数据源不同的新数据&am…

FTP数据上传及WinCE系统FTP根目录设定

嵌入式系统难免要和上位机PC进行数据交换,小数据用TCP/IP实现就可以了,大文件,动则几百兆的数据,用Tcp/Ip自己实现有点划不来,所以我一般采用了Ftp上传的功能,在嵌入式组态软件的下载功能中就实现了组态的F…

JavaScript 垃圾回收机制

JavaScript拥有自动的垃圾回收机制,当一个值,在内存中失去引用时,垃圾回收机制会根据特殊的算法找到它,并将其回收,释放内存。 一 、垃圾回收概念 在有些数据不被需要的时候,这些数据就是垃圾数据&#x…

.Net 平台SerialPort类内部实现探秘

这段时间用Moxa DA660(WinCE5.0平台)测试16口同时下发数据,发现由于该硬件设备的CPU主频仅有260M赫兹,大于10口同时下发数据就会造成发送延迟,导致下发失败。前次用.net的SerialPort类实现了一个PPC红外口读写数据的小…

javaScript 内存泄露

什么是内存泄露 只要程序提出要求 ,运行时就需要提供内存 如果是持续性的服务进程,如果不及时释放不需要的内存,就会影响系统新能,甚至直接会崩溃。 不及时释放的内存 就叫内存泄露 什么情况下会引起? 1、意外的…

CSDN技术大会场记

1、和太阳一起出发2、远观大运村外景3、北京丽亭华苑酒店(CSDN技术大会场地)4、热闹的CSDN技术大会会场真正的CSDN英雄们 -- 名人堂,MVP,MVB这里面最早见过面的是孟宪会,是在我初次当选MVP在微软第一次聚会时认识的&am…

CSDN技术大会

其实在上周就收到了csdn相关人员的参会确认电话,今天早上查收邮件没有收到相关信息,没想到来了一个电话,提醒别忘了周五参会,她说补发邮件已不大可能,可以带名片过去,那边有名单可确认。也好,只…

JavaScript 作用域链

作用域链是什么 函数在使用一个变量的时候,会查找这个变量,如果自己内部没有,就会向上找,这个查找的过程就叫 作用域链 普通函数的作用域链 1、创建一个函数fn()时,会创建一个包含全局变量的作用域链,保存…