Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LuaSocket FTP始终超时_Ftp_Lua_Luasocket_Passive Mode - Fatal编程技术网

LuaSocket FTP始终超时

LuaSocket FTP始终超时,ftp,lua,luasocket,passive-mode,Ftp,Lua,Luasocket,Passive Mode,我已经成功使用了的TCP功能,但是它的FTP模块有问题。我总是在尝试检索(小)文件时超时。我可以在被动模式下使用Firefox或ftp下载文件(在Ubuntu Dapper Linux上) 我原以为可能需要LuaSocket使用被动FTP,但后来我发现默认情况下它似乎可以这样做。我试图通过FTP检索的文件可以通过我机器上的其他程序通过被动FTP访问,但不能通过主动模式访问。我发现了对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"))
这给了我一个暂停时间。我在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那样将套接字设置为非阻塞):

所以我尝试了LuaSocket来对付这两个不同的FTP站点,它们的失败不同但相似。我也在另一台主动FTP工作的机器上尝试过它,但它在那里没有更好的运气(大概是因为LuaSocket总是使用被动模式,从我在
socket/FTP.lua
中读取源代码可以看出)


那么,这里有人能在顶部制作LuaSocket双衬里吗?请注意,在我的机器上,到Dell站点的活动FTP不起作用(我可以连接,但只要我连接到ls,它就会断开连接),因此如果您让LuaSocket工作,请同时注意从另一个程序到Dell站点的活动FTP是否在您的机器上起作用。

Hm。问题似乎是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等的肚脐探险似乎不值得。我认为这是一个严重的设计问题。(卢阿索克的)


值得注意的是,它使用所有caps命令。(可能是因为它来自7位ASCII时代。)

请注意,服务器没有遵循FTP规范,该规范规定命令不区分大小写。请参阅RFC959第5.3节“命令代码为四个或更少的字母字符。 应处理大写和小写字母字符 相同。因此,以下任何一项都可能代表 检索命令:
RETR RETR RETR RETR RETR RETR“

这个问题现在已经解决了,问题和第一个答案对您帮助很大

Luasocket对于RFC 959是正确的(此处的第一条注释对于大写字母不正确,请参见RFC 959第5.2节)

至少Microsoft FTP服务器不兼容。可能还有其他人

解决方案是将pasv更改为pasv,这是命令区分大小写服务器的一种变通方法。有关详细信息,请参阅Lua电子邮件列表,在该列表中,存档将在几天后通过web访问


(编辑ftp.lua的第59行)

这完全有效。除了您的列表,我还将“retr”改为“retr”,但仅此而已。干得好。我也把这个发给了LuaSocket的维护人员。希望下一个版本将被修复。
-    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"))