`
阿尔萨斯
  • 浏览: 4146067 次
社区版块
存档分类
最新评论

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”类的时出现的问题,相关代码如下:

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");
}
}

相关界面如下:

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

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

此时客户端正常:

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

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

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

[叶帆工作室]




<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics