FTP 服务器 PORT 命令解析问题
FTP server PORT command parsing issue
我会尽量保持简单。基本上,每当我从 FTP 命令提示符调用 ls
时,它总是 returns 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);
}
}
但是,我不知道它为什么要这样做。我应该怎么做才能解决这个问题?
服务器returns:
PORT 127,0,0,1,217,89
PORT
255.255.255.25535028
sock1 和 sock2 是我的套接字。
如果您需要更多信息,或者认为错误出在其他地方,请询问,我们很乐意提供。
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
return 值,您就会知道。
你应该学会使用调试器。否则,您实现 FTP 服务器的机会很低。
您最好选择 FTP 服务器的现有开源实现,而不是自己实现。这是一项艰巨的任务,即使是经验丰富的开发人员也难以完成。
我会尽量保持简单。基本上,每当我从 FTP 命令提示符调用 ls
时,它总是 returns 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);
}
}
但是,我不知道它为什么要这样做。我应该怎么做才能解决这个问题?
服务器returns:
PORT 127,0,0,1,217,89
PORT
255.255.255.25535028
sock1 和 sock2 是我的套接字。
如果您需要更多信息,或者认为错误出在其他地方,请询问,我们很乐意提供。
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
return 值,您就会知道。
你应该学会使用调试器。否则,您实现 FTP 服务器的机会很低。
您最好选择 FTP 服务器的现有开源实现,而不是自己实现。这是一项艰巨的任务,即使是经验丰富的开发人员也难以完成。