如何检查非阻塞 Luasocket 客户端是否断开连接?
2018-9-16 19:18:54
收藏:0
阅读:114
评论:1
我正在为 OBS 编写 Lua 脚本,通过 TCP 连接持续地接收来自 ProPresenter(另一个程序) 的数据。我使用 LuaSocket 库建立连接,并成功地获得了数据。
问题是,当我关闭 ProPresenter 时,我的脚本无法注册连接已关闭,即使我将 luasocket 超时设置为 0(以使它成为非阻塞连接)。我需要脚本始终处于非阻塞状态,否则它将导致 OBS 卡死并且帧率降至 1 以下...
然而,如果我将超时设置为 1 秒,Luasocket 就能够成功地注册连接已关闭,而且根据 这里 的示例,在超时为 0 时也应该能够工作。但是显然它没有,我怀疑是因为该示例使用了较旧的 Luasocket 版本,并且最新版本可能已更改。
这是我的代码:
由于超时而无法注册连接已关闭:
function recv_and_process_data()
local data
data, err, partial = s:receive()
if data ~= nil then
--处理接收到的数据。这部分起作用。
elseif err == "closed" then
--由于超时,无法到达这里...
--通知脚本连接已关闭
elseif err == "timeout" then
--一旦关闭 ProPresenter,就会到这里
print(err .. " 偏移量:" .. partial)
end
end
可以注册连接关闭,但会导致 OBS 停滞不前:
function recv_and_process_data()
local data
s:settimeout(1) --将超时设置为 1 秒
data, err, partial = s:receive()
s:settimeout(0)
if data ~= nil then
--处理接收到的数据。这部分起作用。
elseif err == "closed" then
--当关闭 ProPresenter 时,将转到此处
--通知脚本连接已关闭
elseif err == "timeout" then
print(err .. " 偏移量:" .. partial)
end
end
这也不起作用(建议 在此处):
function recv_and_process_data()
local data
data, err, partial = s:receive(0)
if err == "closed" then
print(err .. " 偏移量:" .. partial)
end
end
如果我无法让其工作,我想我得尝试重新连接以验证 ProPresenter 的服务器是否仍在运行。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我也在努力解决这个问题。我发现使用非常小的
settimeout()值仍然会返回一个错误,但它并不会阻碍程序的运行。我使用
local Data, Error = Client:settimeout(0.0001)。