【发布时间】:2011-10-10 06:20:28
【问题描述】:
我有一个从 Lua 中的套接字读取的循环:
socket = nmap.new_socket()
socket:connect(host, port)
socket:set_timeout(15000)
socket:send(command)
repeat
response,data = socket:receive_buf("\n", true)
output = output..data
until data == nil
基本上,数据的最后一行不包含“\n”字符,因此永远不会从套接字中读取。但是这个循环只是挂起并且永远不会完成。每当无法识别“\ n”分隔符时,我基本上都需要它返回。有谁知道这样做的方法吗?
干杯
更新 包括套接字代码
更新2
好的,我已经通过使用“receive_bytes”方法解决了等待“\n”字符的初始问题。
新代码:
--socket set as above
repeat
data = nil
response,data = socket:receive_bytes(5000)
output = output..data
until data == nil
return output
这行得通,我得到了完整的大数据块。但我需要将缓冲区大小从 5000 字节减少,因为它用于递归函数并且内存使用率可能会变得非常高。但是,我的“直到”条件仍然存在问题,如果我将缓冲区大小减小到需要方法循环的大小,它只会在一次迭代后挂起。
更新3 我已经使用 string.match 和 receive_bytes 解决了这个问题。我一次至少接收 80 个字节。然后 string.match 检查数据变量是否包含某种模式。如果是这样,它就会退出。它不是最干净的解决方案,但它适用于我需要它做的事情。代码如下:
repeat
response,data = socket:receive_bytes(80)
output = output..data
until string.match(data, "pattern")
return output
【问题讨论】:
-
如果
data曾经是nil退出循环,那么你会在连接中得到一个错误。 -
好点!不过,数据从来都不是零。我也不认为它会为零。如果接收方法与分隔符“\n”不匹配,数据将保持原样?
-
是的,它会的。套接字没有尽头。您负责构图。
-
我无法控制我应该提到的服务器/服务器代码。我不熟悉框架,但那不会在服务器端完成吗?问候
-
框架是协作的,它是你们双方都同意的协议。您可以控制协议,但服务器和客户端无法控制网络,这就是事情可能会出错的地方。此外,服务器也可能出现故障,您必须注意这些情况。