我在LuaSocket的 TCP 设施上取得了成功,但我在使用它的 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
因此,我针对这两个不同的 FTP 站点尝试了 LuaSocket,但故障不同但相似。我还在另一台可以使用主动 FTP 的机器上尝试过它,但它没有更好的运气(大概是因为 LuaSocket 总是使用被动模式,从我可以通过阅读 中的源代码得知socket/ftp.lua
)。
那么这里的任何人都可以让 LuaSocket 两线在顶部工作吗?请注意,在我的机器上,到戴尔站点的活动 FTP 不起作用(我可以连接,但一旦我ls
断开连接),所以如果你让 LuaSocket 工作,请注意从另一个程序到戴尔站点的活动 FTP 是否工作你的机器。