0

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*')
4

3 に答える 3

1

ネットワーク経由で文字列またはバイナリ データを渡すときに私が常に使用してきた解決策は、最初にフィールドのサイズを渡すことです。次に、既知の長さと一致するまで受信を実行できます。これは、サーバーが次のようになることを意味します。

command,err_msg=socket:receive()
-- build response
socket:send(string.len(response))
-- Note, you should also check for incomplete sends and 
-- run this in a loop until all data has been sent
socket:send(response)

クライアントは次のようになります。

socket:send(command)
resp_len,err_msg = socket:receive()
response=""
repeat
  resp_cur,err_msg = socket:receive(resp_len - string.len(response))
  if resp_cur then
    response = response .. resp_cur
  end
until !resp_cur or string.len(response) >= resp_len end
-- handle any errors from an incomplete receive here
于 2011-07-20T12:51:36.560 に答える
0

luasocket ライブラリ (少なくとも、Corona SDK で使用されているバージョン) にバグがあり、TCP 経由で大きなパケットが断続的に破損する原因になっていると思います。これは、Corona SDK 開発者によって確認されています。この問題は、luasocket ライブラリが TCP 再試行要求を適切に処理していないことが原因であると考えられます。フレーム サイズを標準ネットワーク (ipv4) MTU 未満に制限することで、エラーを回避しようとしています。これにより、パケットの断片化が回避され、問題が発生するのを防ぐことができます。これは、パケット データを自分で小さなフレームに分割し、反対側で再組み立てすることで実現しています。IPV4 の MTU は通常 576 バイトですが、安全のために 512 を試しています。

于 2012-12-24T13:08:08.987 に答える