0

我正在做一个长轮询请求,将超时设置为 10 秒,但它似乎不起作用。我的理解是,如果我们在指定的超时时间内没有得到后端的响应,后端调用应该以timedout错误代码结束。是这样吗?

但是,如果我使用一个非常小的超时,例如 0.001,它就可以工作。所以我认为如果一个请求已经发送到后端,超时不起作用。

对于我的长轮询请求,如果在发送请求并等待响应时我的网络出现故障,lua 套接字会挂在那里并且永远不会从这种情况中恢复。如果我能以任何其他方式处理这个问题,你能帮我吗?

我的 Lua 版本 - Lua 5.1.4 版权所有 (C) 1994-2008 Lua.org, PUC-Rio (double int32)

代码尖晶石:

local http = require "socket.http"
local https = require "ssl.https"
http.TIMEOUT = 10
local r,s,h = https.request({
    url = url,
    method = "GET",
    sink = ltn12.sink.table(results),
    headers = {
        ["Cache-Control"] = "no-cache",
        ["X-Token"] = config.token
    }
})
4

1 回答 1

0

我也遇到了让 https 连接超时的问题。将超时设置为http.TIMEOUT = ...正确的做法,即使对于 https 也是如此(在使用非常小的超时时确认)。

就我而言,DNS 解析是罪魁祸首。这似乎是同步发生的,没有来自 lua 端的强制超时,并且只会在系统调用getaddrinfo(或任何 luasec 内部使用的)返回时超时。

我的一个解决方法是使用 IP 而不是主机名来绕过 DNS 解析。那么超时对我有用。另一个也可以帮助您解决问题的选项是为连接创建一个过期线程。

于 2017-09-01T19:15:46.963 回答