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

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

  1. HttpWebRequest 提示 “基础连接已关闭:发送时发生意外错误” 的解决方法

    HttpWebRequest 多次请求不同网站时,由于安全协议问题.提示错误 "The underlying connection was closed: An unexpected err ...

  2. 基础连接已关闭解决办法

    最近微信公众号功能莫名其妙的出问题,在调腾讯和百度接口就出问题,也不知道哪里抽风,只要调用外部接口,POST或者GET提交,准备出错.提示基础连接已关闭...... httpWebRequest请求错 ...

  3. 敬业签云便签提示“基础连接已关闭,发送时发生错误”如何解决

    部分Windows电脑系统用户在登录敬业签电脑版桌面便签软件时提示错误:The underlying connection was closed:Unable to connect to the re ...

  4. 敬业签云便签提示“基础连接已关闭,发送时发生错误!”如何解决

    部分Windows电脑系统用户在登录敬业签电脑版桌面便签软件时提示错误:The underlying connection was closed:Unable to connect to the re ...

  5. 关于 基础连接已经关闭:接收时发生意外错误

    HttpChannel 类      HttpChannel 类使用 SOAP 协议将消息传输到远程对象或者从远程对象传输消息.所有消息都通过 SoapFormatter 对象来传递,消息在这里被更改 ...

  6. C#使用request.GetRequestStream() 提示“底层连接已关闭:发送时发生意外错误”的问题

    在使用HttpWebRequest的实例request请求网址时,在调用request.GetRequestStream()时提示 "底层连接已关闭:发送时发生意外错误"的问题 论 ...

  7. [c#] 服务器提交了协议冲突. Section=ResponseHeader Detail=CR...的解决方案总结

    [c#] 服务器提交了协议冲突. Section=ResponseHeader Detail=CR...的解决方案总结 参考文章: (1)[c#] 服务器提交了协议冲突. Section=Respon ...

  8. C# WebRequest 基础连接已关闭 连接意外关闭

    1. 出现这种问题一般是因为request和response没有释放造成的,在请求处理完毕对请求request调用abort,对response调用close处理一下就好了. 2.我自己试的是这种: ...

  9. 关于“服务器提交了协议冲突. Section=ResponseStatusLine问题请

    最近在做爬虫程序,在post提交模拟登录时遇到了些问题,一些网站是正常的,但有些怎么测试也是出错,希望高手能帮忙看一下,谢谢. 代码如下:是登录百度贴吧 Code <!--<br /> ...

最新文章

  1. 史上最扯Java图形绘制(J2SE)之一JAVA动画效果
  2. Facebook与Google的互联网霸主争夺战
  3. linux下硬盘测速工具hdparm
  4. Spring Boot 学习之配置文件 application.yml
  5. Android 3.0 SDK 最新官方下载
  6. 拷贝一个用户下的所有表和数据到另外一个库
  7. 面试宝典-Java反射机制
  8. SQL中的日期差函数
  9. TrueType字体结构
  10. 计算机在微表情的应用,一种有效的微表情自动识别方法
  11. Apple Pay 详解
  12. 2021年10月程序员薪资出炉,北京最高工资达45000元!
  13. 构造图片对网络进行对抗攻击n+m=7
  14. 中睿天下入选《2022年中国网络安全市场全景图》
  15. java实例分析宠物商店_Java实现宠物商店管理
  16. 【Rust精彩blog】Rust 中几个智能指针的异同与使用场景
  17. MongoDB热备方案
  18. modis 通道简介
  19. 基于51单片机的秒表系统设计(源代码+Proteus仿真图)
  20. ubuntu 18.04初安装

热门文章

  1. TypeScript学习笔记(七) - 命名空间
  2. C#动态属性(.NET Framework4.5支持)
  3. 音视频解决方案之二次开发
  4. 浅谈自考学习方法(二)
  5. SSO单点登录三种情况的实现方式详解
  6. Golang gRPC 示例
  7. iphone开发畅销书TOP5(china-pub内部数据)
  8. JSPDF运用实例(解决图片跨域问题)
  9. 富文本编辑器ckeditor的使用
  10. 002-docker17.06安装