2016-10-21 22 views
0

データポートに接続できません。私は21のコマンドポートに接続し、ユーザー名とパスワードを送信することができます。それから私はPASV\r\nを送る。私は応答を得て、データポートA * 256 + B = new_portを計算します。 問題はこのポートに接続できないことです。 ソケットを作成するために私はcreateRemoteConnection()機能を使用しています。それはコマンドポートのために初めて2度使用され、私はそこにnew_portを渡して、もう一度それを呼び出します。 お願いします。ありがとうございました。FTP、パッシブモード。要求されたアドレスを割り当てることができません

PASV 
227 Entering Passive Mode (80,251,0,59,158,36). 
A: 158 
B: 36 
Port: 40484 
Creating socket... 
Socket created 
connect failed. Error: Can't assign requested address 

-

int createRemoteConnection(Arguments &arguments,int cmd) { 
int sock; 
struct sockaddr_in server; 
if (DEBUG) { 
    puts("Creating socket..."); 
} 

//Create socket 
sock = socket(AF_INET , SOCK_STREAM , 0); 
if (sock == -1) 
{ 
    fputs("Could not create socket.\n",stderr); 
    exit(1); 
} 

if (DEBUG) { 
    puts("Socket created"); 
} 

char ip[100]; 
struct hostent *he; 
struct in_addr **addr_list; 

if ((he = gethostbyname(arguments.hostname)) == NULL) { 
    herror("gethostbyname"); 
    exit(1); 
} 

addr_list = (struct in_addr **) he->h_addr_list; 

for (int i = 0; addr_list[i] != NULL; i++) { 
    strcpy(ip, inet_ntoa(*addr_list[i])); 
} 

server.sin_addr.s_addr = inet_addr(ip); 
server.sin_family = AF_INET; 
server.sin_port = htons(cmd); 

//Connect to remote server 
if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0) 
{ 
    perror("connect failed. Error"); 
    exit(1); 
} 

if (DEBUG) { 
    puts("Connected\n"); 
} 

return sock; 
} 

答えて

0

あなたはまっすぐPASVコマンドの後に接続することはできません。

STORRESTLISTMLSDなどのコマンドを最初に呼び出す必要があります。

+0

私は 'RETR'を送って' 425 PORTまたはPASVを最初に使用する 'を得ました。 'PASV'を送信し続けてデータソケットを作成しようとしましたが、前と同じエラーで失敗しました。 –

+0

'PASV'を送信し、次に' RETR'を送信してから、ポートに接続しようとします。 –

+0

+同じマシンで動作するスタンドアロンFTPクライアントを使用してファイルをダウンロードできますか? –

関連する問題