Мне удалось успешно использовать средство TCP LuaSocket, но у меня проблемы с его модулем FTP. Я всегда получаю тайм-аут при попытке получить (небольшой) файл. Я могу просто загрузить файл с помощью Firefox или ftp в пассивном режиме (в Ubuntu Dapper Linux).
Я подумал, может быть, мне нужен LuaSocket для использования пассивного FTP, но потом я обнаружил, что он делает это по умолчанию. Доступ к файлу, который я пытаюсь получить через FTP, можно получить с помощью пассивного FTP через другие программы на моем компьютере, но не через активный режим. Я нашел разговор о "взломе" пассивного режима поддержка в LuaSocket, и это обсуждение подразумевает, что более поздние версии перестали использовать пассивный режим, но моя версия, похоже, все равно использует пассивный режим (я использую 2.0.1; самая новая версия 2.0.2 и, похоже, не имеет никаких изменений, относящихся к моему использованию кейс). Я немного смущен тем, как этот пост может относиться к моей ситуации, отчасти потому, что он очень старый, а исходный код LuaSocket теперь мало похож на код в этом обсуждении).
Я сократил свой код до этого:
local ftp = require "socket.ftp"
ftp.TIMEOUT = 10
print(ftp.get("ftp://ftp.us.dell.com/app/dpart.txt"))
Это дает мне тайм-аут. Я запускал его под strace
в Linux (так же, как ptrace
в Solaris). Вот сокращенная стенограмма:
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
fcntl64(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
recv(3, "230-Welcome to the Dell FTP site."..., 8192, 0) = 971
send(3, "pasv\r\n", 6, 0) = 6
recv(3, 0x8089a58, 8192, 0) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {9, 999934}) = 0 (Timeout)
Есть еще один сайт, к которому я пытался подключиться, но у него есть пароль, который я не могу опубликовать здесь, но в этом случае результаты были немного другими... Я получил трассировку, как указано выше, но с успешным завершением select()
в конце, затем это:
recv(3, "227 Entering Passive Mode (123,456,789,0,12,34)\r\n", 8192, 0) = 49
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 4
fcntl64(4, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(4, {sa_family=AF_INET, sin_port=htons(12345), sin_addr=inet_addr("123.456.789.0")}, 16) = -1 EINPROGRESS (Operation now in progress)
select(5, [4], [4], NULL, {9, 999694}) = 0 (Timeout)
Сравните это с трассировкой моей программы «ftp» в пассивном режиме (которая работает нормально, хотя обратите внимание, что она не устанавливает неблокирующие сокеты, как это делает LuaSocket):
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 6
write(5, "PASV\r\n", 6) = 6
read(3, "227 Entering Passive Mode (123,456,789,0,12,34)\r\n", 1024) = 51
connect(6, {sa_family=AF_INET, sin_port=htons(12345), sin_addr=inet_addr("123.456.789.0")}, 16) = 0
Итак, я попробовал LuaSocket на этих двух разных FTP-сайтах с разными, но похожими сбоями. Я также попробовал это с другой машины, где работает активный FTP, и там ему не повезло (предположительно, потому, что LuaSocket всегда использует пассивный режим, насколько я могу судить, прочитав источник в socket/ftp.lua
).
Так может ли кто-нибудь здесь заставить работать двухстрочный LuaSocket сверху? Обратите внимание, что на моей машине активный FTP на сайт Dell не работает (я могу подключиться, но как только я это сделаю ls
, он отключится), поэтому, если вы заставите LuaSocket работать, также обратите внимание, работает ли активный FTP на сайт Dell из другой программы. на вашей машине.