Не вижу, чтобы это было явно отмечено в
документации, но, скорее всего,
list_socket:receive() нужно вызывать в цикле и складывать возвращаемые значения в таблицу, пока оно не вернёт пустую строку, как это сделано в функции
list в примере выше. Возможно, можно считать размер файла (который передаёт FTP-сервер), а затем при помощи методов
receive_bytes или
receive_buf загрузить его целиком за один вызов, но я не вижу никакой документации, которая описывала бы эти методы.
Это происходит потому, что на низком уровне операционную систему можно попросить
считать
байт из соединения в предоставленный приложением буфер заданного размера
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
, и та имеет право вернуть приложению управление, считав меньше, чем
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
. (
Функция list_socket:receive() вызывает
nsock_read(), который, судя по
комментарию, возвращает управление после чтения более-менее произвольного количества байт.)