Microsoft .NET Framework v1.1 中没有支持FTP封装类,使得操作FTP变得很麻烦,搜集整理的一个FTP的类“FtpLib.cs”,利用Socket发送命令的方式实现的的FTP方法,应用了一段时间,发现了其中的一些问题:
当一个命令发送过去之后,需要接受反馈信息,如:“220 Microsoft FTP Service/r/n”,程序中对此做了解析,认为反馈信息中第四个字符是空格(“ ”)的即为命令成功,否则做递归继续接受反馈信息,通常的FTP服务器均可这样操作,可是FTP服务如果做了小小的改动,如加了“FTP站点消息”,情况就不一样了,反馈消息如此:“"220-Microsoft FTP Service/r/n220 Test FTP Server/r/n"”显然这哥们考虑到了这一点,在方法ReadLine()中,对反馈信息按“/n”做了分割,取字符串数组中导数第二条信息,仍然可以认为第四个字符是空格的即为命令成功。单步调试通过,可是正式运行,问题发生了,将消息全部输出之后发现反馈信息中居然缺少了一个回车符号“220-Microsoft FTP Service/r220 Test FTP Server/r/n” 这样导致取出的第四位字符就不是空格了,导致此函数陷入的死循环
第一个想法,既然没有了“/n”那能不能按“/r/n”分割呢?,然后在分割后的字符串数组中到循环取最后一个不是空格的信息串:
- private string ReadLine()
- {
- 。。。。。。。。。。。。
- string s = "/r/n";
- char[] seperator = s.ToCharArray();
- string[] mess = m_strMsg.Split(seperator);
- for(int i = mess.Length - 1; i >=0 ; i--)
- {
- if (mess[i].Trim().Length >0)
- {
- m_strMsg = mess[i];
- break;
- }
- }
- /*
- if(m_strMsg.Length > 2)
- {
- m_strMsg = mess[mess.Length-2];
- //seperator[0]是10,换行符是由13和0组成的,分隔后10后面虽没有字符串,
- //但也会分配为空字符串给后面(也是最后一个)字符串数组,
- //所以最后一个mess是没用的空字符串
- //但为什么不直接取mess[0],因为只有最后一行字符串应答码与信息之间有空格
- }
- else
- {
- m_strMsg = mess[0];
- }
- */
- 。。。。。。。。。
- return m_strMsg;
- }
多次调试问题有出现了,经过了一个递归这次反馈信息中连“/r”也没有了,如“220-Microsoft FTP Service220 Test FTP Server”
第二个想法: 看来分割附不是问题的关键,应该从反馈信息入手,以上两个问题的产生都是经过了一个递归,将反馈信息累加了起来,那么不累加信息会不会有改变呢?
- private string ReadLine()
- {
- 。。。。。。。。。。。。
- if(!m_strMsg.Substring(3,1).Equals(" "))//返回字符串正确的是以应答码(如220开头,后面接一空格,再接问候字符串)
- {
- m_strMsg = "";
- return ReadLine();
- }
- return m_strMsg;
- }
经过这么一个小小的改动(m_strMsg = "")问题解决了。
以上的这个修改是否是最完美的不得而知,当然如果可以的话最后FTP不要加类似登陆消息一类的信息,可以省去很多麻烦。
实现FTP的方法不只这一种,待续。。。。