NSE(nmapスクリプトエンジン)を使用して、ソケット接続を介してコマンドを再帰的に送信し、データを受信するLuaスクリプトがあります。通常は機能しているようですが、大きな文字列が返されるまでは、受信したデータが切り捨てられる傾向があります。次のコマンドを送信すると、前のコマンドで受信されたはずの切り捨て後のデータが通過します(最終的には正しいデータが続きます)。以下の簡略化されたサンプル出力。「data38」は切り捨てられ、コマンドの次のインスタンスで続行されることに注意してください。
"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
問題は、ソケットが特定のバイト数しか受信できず、その後戻ることであるように思われます。「blah」のインスタンスごとに新しいソケットを開きたくないので、Socketはグローバル変数です。ソケットにすべてのデータの受信を待機させ(たとえば、文字列がnullで終了するまで)、データを出力する方法はありますか?
更新 私は、次のように、サイズパラメータをreceiveメソッドに渡すためにさまざまなアプローチを試みてきました。http: //w3.impa.br/~diego/software/luasocket/tcp.html ただし、これらはまったく効果がないようです。 。
response,data = socket:receive(65536)
response,data = socket:receive('a*')