2015-04-30 95 views
0

我會盡量保持這個簡單。基本上,只要我打電話ls從FTP命令提示符下,始終返回425,因爲在相關的觀察,如果在下面的代碼聲明:FTP服務器端口命令解析問題

這顯然是由於溢於行

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是我的插座。

如果您需要更多信息,或者認爲錯誤在其他地方,請詢問,我會盡力爲您提供。

+1

我理解127,0,0,1,217,89是否被你的代碼解析爲'255.255.255.2550'? –

+0

@MartinPrikryl它實際上只有4 255個。我最近發現,作爲一個我不知道如何解決的問題。 – Jf2k

+0

@MartinPrikryl只有前四個數字。 – Jf2k

回答

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服務器的開源實現,而不是實現你自己的。這是一項艱鉅的任務,即使是經驗豐富的開發人員也會遇到麻煩。