免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1759 | 回复: 6
打印 上一主题 下一主题

一个关于网络编程的ftp 协议问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-16 17:56 |只看该作者 |倒序浏览

最近小弟在做一个ftp的客户端程序
用来获取服务器上的一些文件信息

我在程序中,用的是被动模式“EPSV”

在开启被动模式之后,服务器有传回一个端口,这个端口是用来传送数据的。

所以我想问的就是在服务器打开这个端口之后,我要怎样连上这个端口呢?

是不是要用connect()函数,还是要怎样?

还请各位指点迷津啊!

论坛徽章:
34
亥猪
日期:2015-03-20 13:55:11戌狗
日期:2015-03-20 13:57:01酉鸡
日期:2015-03-20 14:03:56未羊
日期:2015-03-20 14:18:30子鼠
日期:2015-03-20 14:20:14丑牛
日期:2015-03-20 14:20:31辰龙
日期:2015-03-20 14:35:34巳蛇
日期:2015-03-20 14:35:56操作系统版块每日发帖之星
日期:2015-11-06 06:20:00操作系统版块每日发帖之星
日期:2015-11-08 06:20:00操作系统版块每日发帖之星
日期:2015-11-19 06:20:00黄金圣斗士
日期:2015-11-24 10:43:13
2 [报告]
发表于 2010-03-16 18:43 |只看该作者
像木马。

论坛徽章:
0
3 [报告]
发表于 2010-03-17 14:30 |只看该作者
回复 2# vermouth


    可否讲得详细一点呢?

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
4 [报告]
发表于 2010-03-17 19:39 |只看该作者
本帖最后由 jiufei19 于 2010-03-17 19:40 编辑

回复 1# 混沌时代


    被动模式即是ftp服务器被动打开一个端口,等待你的客户端connect过去即可,所以你要做的就是connect到这个端口上去

论坛徽章:
0
5 [报告]
发表于 2010-03-21 09:07 |只看该作者
回复 4# jiufei19


    谢谢啊,不过那用connect要怎样连回去呢?是不是要先提取出服务器传回来的端口号呢?如果是的话,能不能指点一二呢?如果可以给一个具体的代码那就谢谢了。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
6 [报告]
发表于 2010-03-21 13:39 |只看该作者
本帖最后由 jiufei19 于 2010-03-21 13:42 编辑

当然要先提去出服务器传回的端口号了呀,端口号就在服务器的应答中,从中读出并解析即可

  /*
   * 用于被动模式下向ftp服务器发送pasv命令
   *
   * 返回值port_pasv, 表示正确收到服务器发回的port
   * 返回值0        , 表示PASV命令发送失败
   */
  int passive_notify(int fd)
  {
      int status;
      int port_pasv;
      char res_buffer[BUFSIZE];
  
      send_ftpcmd (fd, "PASV", NULL);
  
      status = get_ftpcmd_status(fd, res_buffer);
      if( status != 227 )
         /* 如果PASV命令不成功 */
         return 0;
  
      port_pasv = parse_port(res_buffer, strlen(res_buffer));
  
      return port_pasv;
  }

  int parse_port(char *s, int len)
  {
      char *p;
      char *parm[6];
      int port, resi, quot;
      int i = 0;
  
      memset(s + len - 1, 0, 1);
  
      p = strstr(s, "(");
      p++;
      parm[i++] = strtok(p, ",");
      while(parm[i++] = strtok(NULL, ","));
      resi = atoi(parm[5]);
      quot = atoi(parm[4]);
  
      port = quot * 256 + resi;
  
      return port;
  }

论坛徽章:
0
7 [报告]
发表于 2010-03-22 20:46 |只看该作者
被动模式的FTP,这两天正好做这个协议的识别。
客户端发给服务器LITERAL PASV这个命令,请求被动模式传输
服务器返回被动模式的IP地址和端口,格式如:
1841        271.100270        204.152.191.37        192.168.0.18        FTP        Response: 227 Entering Passive Mode (204,152,191,37,178,155).
这样,然后客户端会去连接该IP对应的端口,进行传输。
204,152,191,37,178,155).解析到的IP地址为204.152.191.37,端口是178,155转换成16进制对应的一个16位整数,178-->B2 155->9B,那么端口就是 B29B-->45723
所以下来需要连接的就是204.152.191.37:45723这个地址。
了解协议格式了,根据特征写程序解析就是了,楼上的代码可以参考下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP