Lua socket的接收字符串大小

我有一个 Lua 脚本,使用 NSE(nmap 脚本引擎)递归发送命令并在套接字连接上接收数据。它似乎通常可以正常工作,直到接收到一个大字符串,然后它倾向于截断接收到的数据。在发送下一个命令时,应该在上一个命令中接收到的截断后的数据会出现(最终跟随正确的数据)。简化的样本输出如下。请注意,“data38”被截断并在下一个命令的实例中继续:

“发送命令1”
“接收到的数据 =”
data1
data2
data3
....
....
....
data37
da
**返回**
“发送命令2”
“接收到的数据 =”
ta38(应来自命令1)
data39(应来自命令1)
等等等等

示例代码如下:

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 "**返回**"
 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*')

原文链接 https://stackoverflow.com/questions/6761343

点赞
stackoverflow用户596285
stackoverflow用户596285

我在通过网络传递字符串或二进制数据时一直使用的解决方案是先传递字段的大小。然后你可以运行接收直到它匹配已知长度。这意味着服务器将会像这样:

command,err_msg=socket:receive()
-- 建立响应
socket:send(string.len(response))
-- 注意,您还应检查不完整的发送,并在循环中运行直到所有数据都已发送
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
-- 在这里处理任何不完整的接收错误
2011-07-20 12:51:36
stackoverflow用户1926720
stackoverflow用户1926720

我相信在 luasocket 库中存在一个错误(至少是 Corona SDK 使用的版本),会导致它不时地破坏 TCP 上的大数据包。这已经得到 Corona SDK 开发人员的确认。该问题被怀疑是 luasocket 库没有正确处理 TCP 重试请求导致的。我正在尝试通过限制帧大小为小于标准网络(ipv4)的 MTU 来规避错误,希望这样可以避免分段并防止问题的出现。我将数据分隔成较小的帧,然后在另一端重新汇集。IPv4 的 MTU 通常为 576 字节,我正在尝试使用 512 来保险起见。

2012-12-24 13:08:08
stackoverflow用户736889
stackoverflow用户736889
Just to clarify, the correct parameter to `socket.receive` is `'*a'` not `'a*'` - this may be why you are not receiving all the data from the socket.

仅为澄清,socket.receive 的正确参数是 '*a' 而不是 'a*'。这可能是您未能从套接字中接收所有数据的原因。

2013-12-10 15:43:21