Как отправлять/получать бинарные данные через сокеты?

Мне нужно закодировать FTP-сервер, и у меня проблема с передачей данных.

Я использую команду ftp в Linux, чтобы протестировать ее, и в настоящее время я работаю над LIST, которая отправляет список файлов/каталогов в рабочем каталоге. Все работает нормально (ftp хорошо печатает список файлов), за исключением того, что ftp выводит следующее предупреждение:

WARNING! 5 bare linefeeds received in ASCII mode
File may not have transferred correctly.

Я хотел бы удалить это предупреждение, я думаю, что ftp ожидает двоичные данные, но я не знаю, как отправлять такие данные через сокет, в настоящее время я использую самый простой способ отправки ls результата :

dup2(dst_channel, 1);
execlp("ls", "ls", "-l", NULL);

person Julien Fouilhé    schedule 09.04.2013    source источник
comment
FTP ожидает, что разрывы строк будут CR-LF, но вы просто отправляете LF.   -  person Barmar    schedule 10.04.2013
comment
Есть ли способ изменить это без чтения результата команды ls и замены каждого LF на CR-LF?   -  person Julien Fouilhé    schedule 10.04.2013


Ответы (1)


Протокол FTP указывает, что команда LIST должна отправлять результат в формате NETASCII, что означает, что новые строки представляются как CRLF. Но стандартные программы Linux выводят только LF для новой строки.

Вам нужно запустить команду ls с выходом, подключенным к каналу. Ваш сервер читает из канала, заменяет любые символы \n на `\r\n' и записывает это в сокет.

Вам нужно будет сделать что-то подобное при передаче реальных файлов, за исключением случаев, когда клиент запрашивает двоичный режим.

person Barmar    schedule 09.04.2013
comment
Альтернативой является реализация собственного ls кода, который выводит в формате, ожидаемом FTP. Вам нужно будет сделать это, если вы хотите реализовать команду MLSD в RFC 3659. - person Barmar; 10.04.2013