我有一個使用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