FTP服务器PORT命令解析问题

问题描述 投票:0回答:1

我会尽量保持简单。基本上,每当我从FTP命令提示符处调用ls时,它总是返回425,如以下代码中的相关if语句所示:

显然是由于行中溢出

sprintf(ip_decimal, "%d.%d.%d.%d", act_ip[0], act_ip[1], act_ip[2], act_ip[3]);
         local_data_addr_act.sin_addr.s_addr=inet_addr(ip_decimal);

有人可以向我解释为什么此行将我的IP地址的所有值都更改为255吗?

完整代码如下。

else if(!strcmp(command,"PORT"))
    {
     int act_port[2];
     int act_ip[4], port_dec;
     char ip_decimal[40];
     active=1;
     sscanf(command, "PORT %d,%d,%d,%d,%d,%d",&act_ip[0],&act_ip[1],&act_ip[2],&act_ip[3], &act_port[0], &act_port[1]);
     local_data_addr_act.sin_family=AF_INET;
     sprintf(ip_decimal, "%d.%d.%d.%d", act_ip[0], act_ip[1], act_ip[2], act_ip[3]);
     local_data_addr_act.sin_addr.s_addr=inet_addr(ip_decimal);
     port_dec=act_port[0];
     port_dec=port_dec<<8;
     port_dec=port_dec+act_port[1];
     local_data_addr_act.sin_port=htons(port_dec);
     if (connect(s_data_act,(struct sockaddr*)&local_data_addr_act, (int)sizeof(struct sockaddr))!=0){
       printf("%s%d\n",inet_ntoa(local_data_addr_act.sin_addr),ntohs(local_data_addr_act.sin_port)); 
       sprintf(buf, "425\r\n"); 
       send(sock2, buf, strlen(buf), 0);
       close(s_data_act);
      }
     else{
     sprintf(buf, "200\r\n");
     send(sock2, buf, strlen(buf), 0); 
      }
}

但是,我不知道为什么要这么做。我该怎么做才能解决此问题?

服务器返回:

PORT 127,0,0,1,217,89

PORT
255.255.255.25535028

sock1和sock2是我的套接字。

如果您需要更多信息,或者认为错误在其他地方,请询问,我们将非常乐意提供。

c string-parsing
1个回答
1
投票
if(!strcmp(command,"PORT"))
{
     ...
     sscanf(command, "PORT %d,%d,%d,%d,%d,%d",&act_ip[0],&act_ip[1],&act_ip[2],&act_ip[3], &act_port[0], &act_port[1]);

要进入sscanf呼叫,command必须等于"PORT"。因此,显然command变量不包含参数。因此,sscanf调用失败。您会知道是否测试过sscanf返回值。


您应该学习使用调试器。否则,实现FTP服务器的机会就很低。

您最好选择现有的FTP服务器开源实现,而不是自己实现。这是一项艰巨的任务,即使是经验丰富的开发人员也很难完成。

© www.soinside.com 2019 - 2024. All rights reserved.