2014-11-24 4 views
0

Я хотел бы, чтобы вы, ребята, посоветовали. Я хочу писать FTP-клиент в C/C++, я не хочу использовать некоторые уже написанные библиотеки, поэтому решил написать все это самостоятельно. Но сейчас я столкнулся с небольшой проблемой.FTP-сервер неправильно обрабатывает « r n»

Во время отправки любых данных на сервере все идет правильно, файл создается и заполняется данными, , но сервер полностью игнорирует символы «\ r \ n» и «\ n». Например. Я отправляю текстовый файл со многими строками, , но сервер подключает его к одной строке.

Я пробовал много, но я понятия не имею, где проблема может быть. Я уже пытался отправить файл с моего клиента на мой временный сервер (только функция recv()), и файл сохраняется правильно, как и должно быть. Поэтому я не знаю, почему у FTP-серверов есть проблемы с этим.

(я все делаю в Winsock 2)

Вот функция для отправки файла из моего клиента:

int PutFile(char *filename) 
{ 
    fstream stream; 
    stream.open(filename, ios::in | ios::binary); 
    if(!stream.is_open()) 
    { 
     Print("FTP_COMMAND[info](%d): Could not open file!", __LINE__); 
     return -1; 
    } 
    int sizeoffile = 0; 
    int filepos = 0; 
    stream.seekg(0, ios::end); 
    sizeoffile = stream.tellg(); 
    stream.seekg(0, ios::beg); 

    if(sizeoffile <= 0) 
    { 
     Print("FTP_COMMAND[in](%d): Invalid file!", __LINE__); 
     return -1; 
    } 

    char *file = new char[sizeoffile + 1]; 
    memset(file, 0, sizeoffile + 1); 
    stream.read(file, sizeoffile); 

    char _filename[512]; 
    memset(_filename, 0, 512); 

    char *ptr = 0; 
    if((ptr = strrchr(filename, '/')) > 0 || (ptr = strrchr(filename, '\\')) > 0) 
    { 
     memcpy(_filename, (ptr + 1), strlen((ptr + 1))); 
    } 
    else 
    { 
     memcpy(_filename, filename, strlen(filename)); 
    } 

    Pasv(); 
    TransferType(ASCII); 

    SendCommand("STOR", _filename); 
    memset(ftpcommand_b, 0, 1500); 
    if(recv(ftpcommand, ftpcommand_b, 1500, 0) == SOCKET_ERROR) 
    { 
     closesocket(ftpcommand); 
     return -1; 
    } 
    Print("FTP_COMMAND[in](%d): %s", __LINE__, ftpcommand_b); 

    int maxtime = 3000; 
    setsockopt(ftpdata, SOL_SOCKET, SO_RCVTIMEO, (char*)maxtime, sizeof(int)); 

    while(filepos != sizeoffile) 
    { 
     int ssize = sizeoffile - filepos < 1500 ? sizeoffile - filepos : 1500; 
     Print("FTP_DATA[in](%d): Data size: %d", __LINE__, ssize); 

     if(send(ftpdata, &file[filepos], ssize, 0) == SOCKET_ERROR) 
     { 
      Print("FTP_DATA[in](%d): Failed to send data!", __LINE__); 
      closesocket(ftpdata); 
      return -1; 
     } 
     filepos += ssize; 
    } 

    closesocket(ftpdata); 

    memset(ftpcommand_b, 0, 1500); 
    if(recv(ftpcommand, ftpcommand_b, 1500, 0) == SOCKET_ERROR) 
    { 
     closesocket(ftpcommand); 
     return -1; 
    } 
    Print("FTP_COMMAND[in](%d): %s ssize: %d", __LINE__, ftpcommand_b, filepos); 
    stream.close(); 
    return 0; 
} 

Функция для приема данных работает как шарм, но отправка данных не так много. Я знаю, что мой код не идеален, но я просто пытаюсь понять, как работает FTP. Я, конечно, буду редактировать свой код :)

Спасибо заранее!

+0

Вы отправили команду на перенос FTP-сервера в двоичный режим? – Galik

+0

Спасибо. Да, проблема была решена. – ProXicT

+0

Пожалуйста, покажите код, который использует FTP в двоичном режиме. Код, который вы указали, по-прежнему использует режим ASCII, но не отправляет содержимое файла в формате, совместимом с режимом ASCII. –

ответ

0

Я понял проблему.

Проблема не в отправке данных, а в получении их обратно. В функции GetFile у меня был TransferType установлен как двоичный, а не ASCII, как это было при отправке данных, поэтому проблема решена :)

В любом случае, спасибо вам, ребята, за помощь! :)