2016-10-21 9 views
0

데이터 포트에 연결할 수 없습니다. 21 개의 명령 포트에 연결하여 사용자 이름과 암호를 보낼 수 있습니다. 그런 다음 PASV\r\n을 보냅니다. 응답을 받고 데이터 포트 A * 256 + B = new_port을 계산합니다. 문제는이 포트에 연결할 수 없다는 것입니다. 소켓을 만들려면 createRemoteConnection() 기능을 사용하고 있습니다. 그것은 두 번, 명령 포트에 대한 처음 사용하고 내가 거기에 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 명령 다음에 연결할 수 없습니다.

STOR, REST, LIST, MLSD 또는 이와 유사한 명령을 먼저 호출해야합니다.

+0

'RETR'을 보내고'425 PORT 또는 PASV를 먼저 사용하십시오. '라는 메시지가 나오면'PASV'를 보내고 계속해서 데이터 소켓을 만들려고했지만 이전과 같은 오류로 실패했습니다. –

+0

'PASV'를 보낸 다음'RETR'을 보내고 포트에 연결을 시도하십시오. –

+0

+ 동일한 컴퓨터에서 실행되는 독립 실행 형 FTP 클라이언트를 사용하여 파일을 다운로드 할 수 있습니까? –