【问题标题】:socket receive loop never returns套接字接收循环永远不会返回
【发布时间】: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”不匹配,数据将保持原样?
  • 是的,它会的。套接字没有尽头。您负责构图。
  • 我无法控制我应该提到的服务器/服务器代码。我不熟悉框架,但那不会在服务器端完成吗?问候
  • 框架是协作的,它是你们双方都同意的协议。您可以控制协议,但服务器和客户端无法控制网络,这就是事情可能会出错的地方。此外,服务器也可能出现故障,您必须注意这些情况。

标签: sockets loops lua


【解决方案1】:

我相信在套接字中处理这种情况的唯一方法是设置超时。

以下链接包含一些信息,但它位于 http 套接字上:lua http socket timeout

还有这个(9.4 - Non-Preemptive Multithreading):http://www.lua.org/pil/9.4.html

还有这个问题:http://lua-list.2524044.n2.nabble.com/luasocket-howto-read-write-Non-blocking-TPC-socket-td5792021.html

可以在这个链接上找到关于 Socket 的一个很好的讨论:

http://nitoprograms.blogspot.com/2009/04/tcpip-net-sockets-faq.html

它是 .NET,但概念很笼统。

【讨论】:

  • 我已经包含了套接字代码,包括超时。即使超时它也会挂起。而且我需要插座保持打开状态,因为它将在其他地方使用。问候
  • @greatodensraven:当超时发生时,您的代码没有显示您解决的情况。
  • @greatodensraven:非抢占式多线程可能正是您想要的。
  • 此方法将在递归循环中使用。超时将起作用,但它会大大减慢功能。另一种方法将适合tbh。问候
【解决方案2】:

请参阅更新 3。因为数据的最后一部分始终是相同的模式,所以我可以读取一个字节块,并且每次检查该块是否具有该模式。如果它具有模式,则意味着它是数据的结尾,附加到输出变量并退出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多