设为首页 收藏本站
查看: 2913|回复: 0

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

[复制链接]

尚未签到

发表于 2016-6-10 12:05:33 | 显示全部楼层 |阅读模式
  这段时间由于工作的关系,一直研究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”类的时出现的问题,相关代码如下:
privatevoidbtnDown_Click(objectsender,EventArgse)
{
//stringURL=@"ftp://admin:admin@"+@txtIP.Text+"//NORFlash//";
stringURL=@"ftp://"+txtIP.Text+"//HardDisk//";
stringstrFileName="";

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(WebExceptionexp)
{
lstInfo.Items.Insert(
0,DateTime.Now.ToString()+":错误:"+exp.Message);
return;
}
}
else
{
lstInfo.Items.Insert(
0,DateTime.Now.ToString()+":指定文件不存在");
}

}


  用这个代码同样出现该问题:
privatevoidUpload(stringuri,stringfilename)
{
FileInfofileInf
=newFileInfo(filename);
uri
=uri+"//"+fileInf.Name;
FtpWebRequestreqFTP;

//根据uri创建FtpWebRequest对象
reqFTP=(FtpWebRequest)FtpWebRequest.Create(newUri(uri));

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

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

//指定执行什么命令
reqFTP.Method=WebRequestMethods.Ftp.UploadFile;

//指定数据传输类型
reqFTP.UseBinary=true;

//上传文件时通知服务器文件的大小
reqFTP.ContentLength=fileInf.Length;

//缓冲大小设置为2kb
intbuffLength=2048;

byte[]buff=newbyte[buffLength];
intcontentLen;

//打开一个文件流(System.IO.FileStream)去读上传的文件
FileStreamfs=fileInf.OpenRead();
try
{
//把上传的文件写入流
Streamstrm=reqFTP.GetRequestStream();

//每次读文件流的2kb
contentLen=fs.Read(buff,0,buffLength);

//流内容没有结束
while(contentLen!=0)
{
//把内容从filestream写入uploadstream
strm.Write(buff,0,contentLen);

contentLen
=fs.Read(buff,0,buffLength);
}

//关闭两个流
strm.Close();
fs.Close();
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message,
"UploadError");
}
}


  相关界面如下:
DSC0000.jpg
  服务器,执行到这一步便执行失败,此时客户端程序就会显示如下错误
DSC0001.jpg
  这是和我编写的FTP Server出现问题,和Wince平台上的FTP,Moxa 设备上的FTP都正常,我程序唯一的不同就是支持中文信息。也许就是中文信息不能识别的问题?果不其然,请看下图:
DSC0002.jpg
  此时客户端正常:
DSC0003.jpg
  实际测试发现,“WebClient”类并不是不支持“中文”只要在登录连接过程中ftp Server发送英文信息即可,其他信息可以是中文。
  我想这应该是微软的程序的bug,应该其他客户端都能正常使用,难道偏偏该指令的有问题?!
  后续的几篇文章,我会继续介绍ftp相关的东西,希望大家多多关注。
  [叶帆工作室]
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-228634-1-1.html 上篇帖子: 使用ruby写了一个根据ftp服务器列表自动遍历所有服务器查找对应的东东 下篇帖子: 利用edtftpj组件实现FTP文件的上传--方法二(2)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表