FTP之‘基础连接已关闭:服务器提交了协议冲突’错误探析
2007-04-13 13:13
369 查看
这段时间由于工作的关系,一直研究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相关的东西,希望大家多多关注。
一、微软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之‘基础连接已关闭:服务器提交了协议冲突’错误探析
- FTP之‘基础连接已关闭:服务器提交了协议冲突’错误探析
- FtpWebRequest 的杂症 - "The server committed a protocol violation","基础连接已经关闭: 服务器提交了协议冲突"
- asp.net使用FtpWebRequest向ftp上传文件报错 基础连接已经关闭: 服务器提交了协议冲突
- .net中FTP GetResponse“基础连接已关闭:服务器提交了协议冲突”的解决办法
- FTP基础连接已关闭:服务器提交了协议冲突(C#)解决办法
- 在用HttpWebRequest的时候,发现返回"基础连接已经关闭: 该服务器提交了 HTTP 协议冲突
- 基础连接已经关闭: 该服务器提交了 HTTP 协议冲突
- 基础连接已经关闭: 该服务器提交了 HTTP 协议冲突?
- VS2008 无法在web服务器上启动调试 基础连接已经关闭 发送时发生错误
- FTP上传文件时 System.Net.WebException: 基础连接已经关闭: 接收时发生错误。
- 如何解决FtpWebRequest基础连接已经关闭;接收时发生错误(ZZ)
- "无法在Web服务器上启动调试。基础连接已经关闭:接收时发生错误"
- 无法再Web服务器上启动调试。基础连接已经关闭:发送时发生错误。
- VS2008 无法在web服务器上启动调试 基础连接已经关闭 发送时发生错误
- 无法在Web服务器上启动调试。基础连接已经关闭:接收时发生错误--解决
- 针对错误 “服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF” 的原因分析
- C# 基础连接已经关闭: 服务器关闭了本应保持活动状态的连接的错误
- 关于 服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF 错误
- 解决连接vcenter (客户端无法向服务器发送完整的请求。(基础连接已经关闭:发送时发生错误。)) 问题