Я хотел бы, чтобы вы, ребята, посоветовали. Я хочу писать 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. Я, конечно, буду редактировать свой код :)
Спасибо заранее!
Вы отправили команду на перенос FTP-сервера в двоичный режим? – Galik
Спасибо. Да, проблема была решена. – ProXicT
Пожалуйста, покажите код, который использует FTP в двоичном режиме. Код, который вы указали, по-прежнему использует режим ASCII, но не отправляет содержимое файла в формате, совместимом с режимом ASCII. –