sách gpt4 ai đã đi

ftp - LuaSocket FTP 总是超时

In lại 作者:行者123 更新时间:2023-12-04 21:24:19 25 4
mua khóa gpt4 Nike

我已经成功使用 LuaSocket 的 TCP 工具,但我在使用它的 FTP 模块时遇到了问题。尝试检索(小)文件时,我总是超时。我可以在被动模式下使用 Firefox 或 ftp 下载文件(在 Ubuntu Dapper Linux 上)。

我想可能是我需要LuaSocket来使用被动FTP,但后来我发现它似乎默认这样做了。我试图通过 FTP 检索的文件可以通过我机器上的其他程序使用被动 FTP 访问,但不能通过主动模式访问。我发现 some talk 关于将被动模式支持“破解”到 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"))

这让我超时。我在 Linux 上的 strace 下运行它(与 Solaris 上的 ptrace 相同)。这是一个删节的成绩单:

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 工作的机器上尝试过它,但它在那里没有更好的运气(大概是因为 LuaSocket 总是使用被动模式,从我通过阅读 socket/ftp.lua 中的源代码可以看出).

那么这里的任何人都可以使顶部的 LuaSocket 两行工作吗?请注意,在我的机器上,到戴尔网站的事件 FTP 不起作用(我可以连接,但只要我这样做 ls 它就会断开连接),所以如果你让 LuaSocket 工作,请注意是否事件 FTP从另一个程序访问 Dell 的网站可以在您的机器上运行。

1 Câu trả lời

嗯。看起来问题是 LuaSocket 使用小写的“pasv”。我将尝试找出解决方法。


嗯。不,它看起来非常优雅地焊接关闭。最简单的做法可能是将 那个特定文件 复制到 LUA_PATH 中较早路径的层次结构中的等效位置。也就是说,(通常)制作文件的本地副本,例如path/to/your/project/socket/ftp.lua.

然后编辑本地文件:

- self.try(self.tp:command("user", user or USER))
+ self.try(self.tp:command("USER", user or USER))
- self.try(self.tp:command("pass", password or PASSWORD))
+ self.try(self.tp:command("PASS", password or PASSWORD))
- self.try(self.tp:command("pasv"))
+ self.try(self.tp:command("PASV"))
- self.try(self.tp:command("port", arg))
+ self.try(self.tp:command("PORT", arg))
- local command = sendt.command or "stor"
+ local command = sendt.command or "STOR"
- self.try(self.tp:command("cwd", dir))
+ self.try(self.tp:command("CWD", dir))
- self.try(self.tp:command("type", type))
+ self.try(self.tp:command("TYPE", type))
- self.try(self.tp:command("quit"))
+ self.try(self.tp:command("QUIT"))

相反,使用 getfenv、getmetatable 等的 navelnaut 探险似乎并不值得。我认为这是一个严重的设计问题。 (LuaSocket 的)

值得注意的是 RFC0959使用全大写命令。 (可能是因为它来自 7 位 ASCII 时代。)

关于ftp - LuaSocket FTP 总是超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/210371/

25 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com