Microsoft .NET Framework v1.1 FTP访问类引发的思考?

本文探讨了在Microsoft .NET Framework v1.1环境下使用自定义FTP类“FtpLib.cs”时遇到的问题。该问题源于FTP服务器反馈信息的变化导致程序无法正确解析,最终陷入了死循环。文章详细介绍了如何通过修改读取反馈信息的方式解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

             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”分割呢?,然后在分割后的字符串数组中到循环取最后一个不是空格的信息串:

  1. private string ReadLine()
  2. {
  3.      。。。。。。。。。。。。
  4.      string s = "/r/n";
  5.      char[] seperator = s.ToCharArray(); 
  6.      string[] mess = m_strMsg.Split(seperator);
  7.      for(int i = mess.Length - 1; i >=0 ; i--)
  8.      {
  9.           if (mess[i].Trim().Length >0)
  10.           {
  11.                m_strMsg = mess[i];
  12.                break;
  13.           }
  14.      }
  15.      /*
  16.      if(m_strMsg.Length > 2)
  17.      {
  18.           m_strMsg = mess[mess.Length-2];
  19.           //seperator[0]是10,换行符是由13和0组成的,分隔后10后面虽没有字符串,
  20.           //但也会分配为空字符串给后面(也是最后一个)字符串数组,
  21.           //所以最后一个mess是没用的空字符串
  22.           //但为什么不直接取mess[0],因为只有最后一行字符串应答码与信息之间有空格
  23.      }
  24.      else
  25.      {
  26.           m_strMsg = mess[0];
  27.      }
  28.      */
  29.      。。。。。。。。。
  30.      return m_strMsg;
  31. }

多次调试问题有出现了,经过了一个递归这次反馈信息中连“/r”也没有了,如“220-Microsoft FTP Service220 Test FTP Server”

 

 

第二个想法: 看来分割附不是问题的关键,应该从反馈信息入手,以上两个问题的产生都是经过了一个递归,将反馈信息累加了起来,那么不累加信息会不会有改变呢?

  1. private string ReadLine()
  2. {
  3.      。。。。。。。。。。。。
  4.      if(!m_strMsg.Substring(3,1).Equals(" "))//返回字符串正确的是以应答码(如220开头,后面接一空格,再接问候字符串)
  5.      {
  6.           m_strMsg = "";
  7.           return ReadLine();
  8.      }
  9.      return m_strMsg;
  10. }

经过这么一个小小的改动(m_strMsg = "")问题解决了。

 

以上的这个修改是否是最完美的不得而知,当然如果可以的话最后FTP不要加类似登陆消息一类的信息,可以省去很多麻烦。

实现FTP的方法不只这一种,待续。。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值