2013-12-06 1 views
0

Я пытаюсь вручную получить файл с ftp-сервера. До сих пор я могу подключиться к серверу и проверить его ответ 220, но затем я хочу отправить имя пользователя и профайлы, чтобы отобразить некоторые случайные байты. Первый мой код:manully установить соединение с ftp-сервером с помощью сокетов

struct request 
    { 
    int reply;       /* TRUE = request reply from server */ 
    int msgLen;      /* length of message text */ 
    char message[REQUEST_MSG_SIZE]; /* message buffer */ 
    }; 

     ... 
     //ESTABLISH SOCKET CONNECTION 
     ... 

/* send request to server */ 
strcpy(myRequest.message,"ftp"); 
myRequest.msgLen = 3; 
if (write (sFd, (char *) &myRequest, sizeof (myRequest)) == ERROR) 
     { 
     perror ("write"); 
     close (sFd); 
     return ERROR; 
     } 

if (read (sFd, replyBuf, REPLY_MSG_SIZE) < 0) { 
    perror ("read"); 
    close (sFd); 
    return ERROR; 
} 

// CHECK if ser ver responded with code 220 
if (strstr(replyBuf,"220")==NULL) { 
    perror ("Response220"); 
    close (sFd); 
    return ERROR; 
} 

// send user name to server 
strcpy(myRequest.message,"USER **"); 
myRequest.msgLen = 7; 
if (write (sFd, (char *) &myRequest, sizeof (myRequest)) == ERROR) 
     { 
     perror ("write"); 
     close (sFd); 
     return ERROR; 
     } 

    if (read (sFd, replyBuf, REPLY_MSG_SIZE) < 0) { 
     perror ("read"); 
     close (sFd); 
     return ERROR; 
    } 


printf ("MESSAGE FROM SERVER:\n%s\n", replyBuf); 

, но по какой-то причине, я всегда, кажется, есть некоторые случайные байты в моей отправки строки: первый, FTP-строка выглядит следующим образом:

36 1.767818000 3.94.213.214 3.94.213.53 FTP 70 Request: \356\356\356\356\000\000\000\003ftp\000"\032\244^

который он может иметь дело, ответ сервера:

38 1.777790000 3.94.213.53 3.94.213.214 FTP 74 Response: 220 (vsFTPd 3.0.2)

б ут то строка USER выглядит следующим образом:

40 1.781575000 3.94.213.214 3.94.213.53 FTP 70 Request: \356\356\356\356\000\000\000\aUSER **\000

которой она, не-удивительно, что не может сделать с. После этого я ожидаю, что сервер попросит меня ввести пароль.

Клиент работает на машине VxWorks, а сервер vsFTP на Linux

ответ

1

Почему вы отправки-структуру через сокет, вам просто нужно отправить данные. Кроме того, вы не можете отправлять данные по тому же соединению ..... как только первое соединение, которое вы делаете с ftpd, является командным соединением, когда вы отправляете данные, открывается другое соединение. Я думаю, вам нужно увидеть FTP RFC 959, прежде чем продолжить этот путь.

Смежные вопросы