FTP之‘基础连接已关闭:服务器提交了协议冲突’错误探析-阿里云开发者社区

开发者社区> 技术小美> 正文

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

简介:
+关注继续查看

这段时间由于工作的关系,一直研究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相关的东西,希望大家多多关注。

 
















本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/324328,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 30 章 可靠性和预写式日志_30.3. 异步提交
30.3. 异步提交 异步提交是一个允许事务能更快完成的选项,代价是在数据库崩溃时最近的事务会丢失。在很多应用中这是一个可接受的交换。 如前一节所述,事务提交通常是同步的:服务器等到事务的WAL记录被刷写到持久存储之后才向客户端返回成功指示。
827 0
Nacos服务自动关闭问题汇总
Nacos服务自动关闭问题汇总
15 0
【转】Windows 7下十个不能关闭的服务
1.杀毒软件服务 (如果是试用版的就算了 )     2.DNS Client     官方解释:DNS 客户端服务(dnscache)缓存域名系统(DNS)名称并注册该计算机的完整计算机名称。
823 0
如何将本地项目提交到git服务器中
如何将本地项目提交到git服务器中 1、初始化git     git init 2、添加要提交的文件     git add 文件名(注:当要把整个项目都提交则用 git add .  ,每次文件只要被修改,都要重新在add一次,不然commit只会提交add 暂存区里的内容) 3、完成提交 .
1719 0
SVN:服务器端设置提交时必须填写注释
遇到问题:       在团队开发的时候,总有那么些人非常个性,签入的时候啥都木有,有时候会给回滚版本库带来很多困难。为了解决这个问题,我们可以在SVN服务器端设置签入时必须填写注释,否则不允许签入。
935 0
解决办法:本机远程连接服务器时出现身份验证错误,要求函数不受支持!
在用户名、IP、密码都对的情况下别的电脑能连接上,只有自己的电脑连接不上说函数不受支持 具体解决办法 windows专业版以上: 打开组策略编辑器 选择:计算机配置——管理模板——系统——凭据分配 双击“加密Orac...
1962 0
开启关闭服务器以及登录退出客户端|学习笔记
快速学习开启关闭服务器以及登录退出客户端
53 0
+关注
6906
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载