我有一个使用NSE(nmap脚本引擎)递归地发送命令并通过套接字连接接收数据的Lua脚本。它似乎通常工作,直到它得到一个大的字符串回来,然后它往往截断收到的数据。在发送下一个命令时,在之后的数据截断(应该在前一个命令中接收到)通过(最终跟随正确的数据)。下面简化了示例输出。注意“data38”被截断,并继续在命令的下一个实例:Lua套接字接收字符串大小
"send command1"
"recieved data ="
data1
data2
data3
....
....
....
data37
da
**returning**
"send command2"
"received data ="
ta38 (should be from command1)
data39 (should be from command1)
etc etc etc
示例代码如下:
local function blah(id)
local response
local data
local commmand
command = "dir..id"
socket:send(command)
response,data = socket:receive()
print(data)
--do recursion her depending on data results.
print "**returning**"
return
action = function(host,port)
socket = nmap.new_socket()
socket:connect(host,port)
socket:set_timeout(15000)
test = blah(id)
return test
这个问题似乎是套接字只能接收一定数量的字节,然后返回。 Socket是一个全局变量,因为我不想为每个“blah”实例打开一个新的套接字。有没有什么办法可以让套接字等待接收所有的数据(直到字符串为空例如终止),然后打印数据?
更新 我一直在尝试不同的方法来传递一个大小参数来接收方法,如说: http://w3.impa.br/~diego/software/luasocket/tcp.html 然而,这些似乎都没有任何效果如。
response,data = socket:receive(65536)
response,data = socket:receive('a*')
每次调用函数时我都不知道数据的大小,数据大小可能会有所不同。我试过socket:receive('a *'),它从套接字读取,直到连接关闭。但结果是一样的。 – greatodensraven
这就是为什么我建议你*先发送尺寸*。 – BMitch
你的意思是类似于:response,data = socket:receive(65536)??我试图按照这些方式实现某些内容,但似乎仍然没有区别 – greatodensraven