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

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
               

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

                                                                                          [叶帆工作室]

 

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

服务器提交协议冲突. Section=ResponseStatusLine解决方法 用HttpWebrequest向服务器POST或GET数据时,有的时候或者有的机子会出现"服务器提交协议冲突. Section=ResponseStatusLine"的错误,我用文档整理出来可用解决方法 立即下载

相关推荐

HttpWebRequest的常见错误使用TcpClient可避免

有时使用HttpWebRequest对象会出现错误,总结有三种: 1、System.Net.WebException: 服务器提交协议冲突. Section=ResponseStatusLine 2、System.Net.WebException: 基础连接已经关闭: 连接被意外关闭。 3、System.Net.ProtocolViolationException: 无法发送具有此谓词类型的内容正文。 使用TcpClient对象搞定: 代码如下: private string GetHTMLTCP(string URL) { string strHTML = “”;//用来保存获得的HTM

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

这段时间由于工作的关系,一直研究FTP 服务器/客户端的相关程序,发现了不少问题,有些确实是微软的bug(或者说相关代码不够健壮) 。 一、微软IE浏览器作为FTP客户端的bug        上传含中文字符的多级目录的失败的bug,文件名是否中文无关,只要目录中出现中文字符,就会出现该问题。用网络嗅探器探测交互的数据发现,创建多个目录成功后,在用“CWD”命令调转当前目录时FTP客户端出现b...

weixin_34405557的博客 694

Visionpro 使用CogPMAlignTool工具提取匹配轮廓点

【代码】Visionpro 使用CogPMAlignTool工具提取匹配轮廓点。

weixin_43947315的博客 2070

.net中FTP GetResponse“基础连接关闭服务器提交协议冲突”的解决办法

.net中FTP GetResponse“基础连接关闭服务器提交协议冲突”的解决办法:原创:钟德荣(xjzdr@163.com)在vs2005开发的一个版本下载程序中,将新版本上传到FTP服务器上,通过.net的FTPGetResponse下载新的版本,和服务器建立连接时即报错:“基础连接关闭服务器提交协议冲突”。但使用CUTPFT客户端下载是正常的。FTP服务器上SER_U建

eNet 5275

在用HttpWebRequest的时候,发现返回"基础连接已经关闭:服务器提交了 HTTP 协议冲突

在用HttpWebRequest的时候,发现返回"基础连接已经关闭: 该服务器提交了 HTTP 协议冲突".原来是微软没有容忍不符合RFC 822中的httpHeader中一些字符的问题(如空格),还有必须以CRLF结束的规定的服务器响应。 1。对于诸如空格问题引起的问题,建议不要采用HttpWebRequest类。采用底层的Socket来编写,例子如下:  程序代码

yazhouren的专栏 2496

.Net 从FTP下载文件提示”基础连接已经关闭: 服务器提交协议冲突。“

通过.Net从FTP下载文件,提示基础连接已经关闭: 服务器提交协议冲突。很奇怪的是部分文件比如excel可以下载,部分文件又下载不了。在网上找了一圈,发现很多都说是中文的问题,我在config中的system.web下加入了 <globalization requestEncoding="utf-8" responseEncoding="utf-8" uiCulture="zh-CN" culture="zh-CN" fileEncoding="utf-8" /> 还是没用,后来仔细找

cslp517的专栏 1725

基础连接关闭:服务器提交协议冲突,c#-基础连接关闭服务器违反了协议.的......

我正在使用以下代码上传文件,它可以正常工作,但有时会引发此错误“底层连接关闭服务器违反了协议”,并停止了该过程,当我再次运行该文件时,它没有任何问题地上传文件.我注意到的一件事是,如果我运行此过程来上传多个文件,则有时会收到此错误;如果我的文件少于5个,则说明工作正常,不知道我在哪里以及要查看的内容.我在google上搜索时,找不到任何可靠的解决方案,甚至一个msdn博客都说这是FTPwebr...

weixin_39832875的博客 1008

FTP基础连接关闭服务器提交协议冲突(C#)解决办法

.net中FTP GetResponse“基础连接关闭服务器提交协议冲突”的解决办法:原创:钟德荣(xjzdr@163.com)欢迎访问我的bloghttp://blog.csdn.net/xjzdr/在vs2005开发的一个版本下载程序中,将新版本上传到FTP服务器上,通过.net的FTPGetResponse下载新的版本,和服务器建立连接时即报错:“基础连接关闭服务器提交

eNet 1万+

C#通过ftp上传文件报错:System.Net.WebException: 基础连接已经关闭: 服务器提交协议冲突

原因是传统 FTP 客户端会因协议不兼容。FtpWebRequest 和 FluentFTP 是 标准 FTP 客户端,仅支持 FTP 协议,而 ssh.net 是 SSH 客户端库,支持 SFTP 协议ftp上传文件,报错:System.Net.WebException: 基础连接已经关闭: 服务器提交协议冲突。试了 FtpWebRequest 类 和 FluentFTP 客户端库都不行。更换为 SSH.NET 后可以了。

多多鱼的博客 489

FtpWebRequest 的杂症 - "The server committed a protocol violation","基础连接已经关闭: 服务器提交协议冲突"...

基于.Net Framework 2.0的客户端,在开发用的VISTA和Server 2008上一切正常,放到客户机器上,有的总是报错 "The server committed a protocol violation"(中文系统是"基础连接已经关闭: 服务器提交协议冲突"). 后来发现是由于FTP服务器返回了非法字符,导致 FtpWebRequest 报错. 但是为什么只会在部分XP用...

weixin_30920513的博客 887

asp.net使用FtpWebRequest向ftp上传文件报错 基础连接已经关闭: 服务器提交协议冲突...

开发环境:windows2003+vs2005。 服务器环境:windows2003+。net 2.0+servU 该程序主要使用FtpWebRequest类进行文件上传。 上传过程报错: System.Net.WebException: 基础连接已经关闭: 服务器提交协议冲突。 在 System.Net.FtpWebRequest.CheckError() 在 Sys...

weixin_30883271的博客 826
上一篇: 一个控件几行代码实现换肤(可支持菜单)
下一篇: NET Micro Framework常见问题问答
有一颗椰子树
博客等级 码龄8年 32粉丝 127原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值